收录日期:2019/10/18 22:07:41 时间:2016/06/06 10:24:28 标签:基础类
我现在用VC做一个GIS系统,但是在绘制直线时,系统自带的线型太少,如何自定义自己的线型,
譬如我要绘制铁路的这种线型?
请各位大侠指点一下小弟.
在线等待中........
用GDI+,Pen可以设置这种样式,虚线,间隔处用白色

GDI不知道可不可以用图片Brush
楼上的兄台,我不能用GDI+,因为我现在是在VC++6.0中开发的,不能用GDI+啊!
谢谢你的回复!
继续等待中.......
VC6怎么就不能用GDI+

我做那些都用的GDI+,虽然它效率没GDI高

但是比GDI功能强,绘制效果也要好

兄台,VC6怎么用GDI+啊?我只知道用GDI.能否讲详细点.
不好意思,小弟比较菜,学VC不久.

另外,最终我是要把这个用VC开发的系统
移植到Linux平台上,如果用GDI+的话,在
Linux下不知道好不好做.
vc6可以用GDI+的
还要移植到LINUX?

LINUX下能用MFC写的程序吗,汗

给你一篇文章,要找GDI+的中文资料可以安装MSDN2003或者2005,里面C#的GDI+资料都是中文的

在VC中使用GDI+[转] 

色彩鲜艳漂亮的高品质图像,一个个形象生动的Windows图标,高速运动、活灵活现的三维动画,这些无一不显示出程序设计者的艺术才华。在程序设计中,图像处理已经成为每个程序员的必修课。 

在VC中编程显示一幅位图,下列步骤是不可缺少的: 装入位图、获得位图的大小信息、启用设备环境、位传输等,所需的程序代码一般比较冗长而且复杂。如果想将装入的位图另存为其他格式的图像文件,代码就更长了。这一切都是因为GDI本身的局限性造成的。 

GDI+技术 

随着Windows 2000的推出,上述情况有了极大的改观: 程序员不必了解每种图像格式的具体含义,照样可以写出多格式图像浏览或转换程序,这一切全都依赖于Windows 2000及后继版中所使用的GDI+技术。 

和传统的GDI不同,GDI+中引入了对COM(组件对象模型)技术的支持,通过COM技术,GDI+简化了对图像文件的访问(打开、保存)。它是通过调用COM组件来实现的,GDI+扮演的只是指挥者,而非操作员。对于图像文件,GDI+所关心的不是图像文件的文件头信息,不论要打开的文件格式是什么类型,GDI+首先要做的是在注册表中查看该图像格式的编码(或解码)信息是否已经注册(HKEY_CLASSES_ROOT\MIME\Database\Content Type)。如果已经注册,就通过该编码信息调用COM组件,就这么简单。这种技术早就在微软的其他软件中使用了(如IE)。“体验”过Nimda病毒的朋友可能对“audio/wav”这段代码并不陌生,Nimda就是靠它来伪装自己的:让IE认为附件是WAV文件而自动打开可执行程序,这其实也是IE使用COM技术的一个突出表现。 

配合GDI+的推出,微软也同时发布了相应的SDK,如果已经安装了最新的Microsoft PlatForm SDK或已经开始使用VS.NET,GDI+的SDK就已经在系统中了。如果没有的话,可以到http: //noner.top263.net/progtool上去下载GDI+的头文件和库文件。有了GDI+之后,只需简单地创建一个图形对象(Graphics object),然后直接调用该对象的方法(methods)进行绘图即可。图形对象是GDI+中的核心,正如DC之于GDI那样。图形对象和DC有许多相似的地方,在使用上遵循着相同的使用规则,但是两者在本质上已经有很大的区别。一个是基于句柄的GDI,一个是基于组件对象模型的GDI+。使用GDI+的SDK编程,必须按照下面的规范来进行:使用GDI+的命名空间(namespace Gdiplus),在使用GDI+函数时必须进行GDI+的初始化,使用完毕要销毁GDI+,这些规范在下面所列的程序中有详细的说明。 

访问注册表编码信息 

上面说到GDI+是通过在注册表中查看编码信息来访问图像文件的,在GDI+的SDK中,编码信息是存储在 ImageCodecInfo类中的,在这个类中,有编码的CLSID(COM组件的GUID标识码)、编码方式描述等。对于GDI,在注册表中访问编码信息通常使用以下两个函数来实现: 

1. 查看系统中可用的图像编码信息(数量及大小) 

Status GetImageEncodersSize( 

UINT* numEncoders, 

//存储编码器数量的地址 

UINT* size //存储编码信息所需内存大小 

); 

2. 得到所有的编码信息 

Status GetImageEncoders( 

UINT numEncoders,//可用编码器数量 

UINT size,//存储编码器信息所需内存(由ImageCodecInfo类组成的数组的大小) 

ImageCodecInfo* encoders//编码器信息指针 

); 

在GetImageEncoders函数中,参数numEncoders和size都是由GetImageEncodersSize返回的。下面的代码在注册表中查找具体格式图像的编码方式: 

int GetImageCLSID(const WCHAR* format, CLSID* pCLSID) 

{ //得到格式为format的图像文件的编码值,访问该格式图像的COM组件的GUID值保存在pCLSID中 

UINT num = 0; 

UINT size = 0; 

ImageCodecInfo* pImageCodecInfo = NULL; 

GetImageEncodersSize(&num, &size); 

if(size == 0) 

return FALSE; // 编码信息不可用 

//分配内存 

pImageCodecInfo = (ImageCodecInfo*)(malloc(size)); 

if(pImageCodecInfo == NULL) 

return FALSE; // 分配失败 

//获得系统中可用的编码方式的所有信息 

GetImageEncoders(num, size, pImageCodecInfo); 

//在可用编码信息中查找format格式是否被支持 

for(UINT i = 0; i < num; ++i) 

{ //MimeType:编码方式的具体描述 

if( wcscmp(pImageCodecInfo[i] 

.MimeType, format) == 0 ) 



*pCLSID = pImageCodecInfo[i] 

.Clsid; 

free(pImageCodecInfo); 

return TRUE; 





free(pImageCodecInfo); 

return FALSE; 



实现多格式的图像浏览和转换 

有了前面的知识,实现多格式的图像的浏览与转换就不是什么难事了。 

1.在VC中创建一个SDI项目ImageShow,对GDI+声明和初始化及销毁进行代码编制,具体代码如下: 

#include “Gdiplus.h” 

using namespace Gdiplus; 

CImageShowView::CImageShowView() 



//初始化GDI+ 

GdiplusStartupInput gdiplusStartupInput; 

ULONG_PTR gdiplusToken; 

GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); 



CImageShowView::~CImageShowView() 



//销毁GDI+ 

ULONG_PTR gdiplusToken; 

GdiplusShutdown(gdiplusToken); 



2. 通过类向导(Class Wizard),重载“文件”菜单中的“打开”和“另存为”两项。为了编程的简单,本程序只将当前打开的图像文件直接存为BMP文件(实际上保存为其他格式的文件也很简单,只不过是对文件名进行分析而已)。另外,为了在打开和保存文件时进行文件名的传递,还应在CImageShowView类中加入一全局变量“CString strOpenFileName”。“打开”和“另存为”两菜单的对应代码如下: 

WCHAR* ToWChar(char * str) 



//在GDI+中,有关字符的参数类型全部都是WCHAR类型 

//该函数是将传统字符串进行转换 

static WCHAR buffer[1024]; 

wcsset(buffer,0); 

MultiByteToWideChar(CP_ACP,0,str,strlen(str),buffer,1024); 

return buffer; 



void CImageShowView::OnFileOpen() 



//本程序能够打开各类常见格式的图像文件 static char szFilter[]=“常见格式图像文件(*.*)|*.*|”; 

CFileDialog dlgChoseImage(1,NULL,NULL,NULL,szFilter); 

if(dlgChoseImage.DoModal()==IDOK) 



strOpenFileName=dlgChoseImage 

.GetPathName(); 

//打开文件后立即在窗口中显示(重绘客户窗口) 

this->Invalidate(); 





void CImageShowView::OnFileSaveAs() 



if(strOpenFileName.IsEmpty()) 



AfxMessageBox(“当前没有打开图像文件,不能进行保存!”); 

return; 



//建立图形对象 

Graphics graphics(GetDC()->m_hDC); 

//装入当前已经打开的图像文件 

Image image(ToWChar(strOpenFileName.GetBuffer(strOpenFileName.GetLength()))); 

CString strFileSave; 

//将其他格式的图像全部另存为BMP文件 

static char szFilter[]=“位图(*.BMP)|*.BMP|”; 

CFileDialog dlgChoseImage(0,“BMP”,NULL,NULL,szFilter); 

if(dlgChoseImage.DoModal()==IDOK) 



strFileSave=dlgChoseImage.GetPathName(); 

CLSID clsid; 

if(GetImageCLSID(L“image/bmp”,&clsid)) 



image.Save(ToWChar(strFileSave.GetBuffer(strFileSave.GetLength())), &clsid, NULL); 

//将保存后的图像进行显示 

strOpenFileName=strFileSave; 

this->Invalidate(); 







3.为了浏览图像转换前后的效果,还应该在窗口中分别绘制转换前后的图像,这需要在OnDraw函数中添加绘制代码,如下所示: 

void CImageShowView::OnDraw(CDC* pDC) 



CImageShowDoc* pDoc = GetDocument(); 

ASSERT_VALID(pDoc); 

//如果没有选择显示图像文件,则不用重绘 

if(strOpenFileName.IsEmpty()) 

return; 

//显示当前打开的图像文件的全名 

this->GetParent()->SetWindowText(strOpenFileName); 

//建立图像对象 

Graphics graphics(pDC->m_hDC); 

//装入图形文件 

Image image(ToWChar(strOpenFileName.GetBuffer(strOpenFileName.GetLength()))); 

Point destPoints[3] = 



Point(0, 0), 

Point(image.GetWidth(), 0), 

Point(0, image.GetHeight()) 

}; 

Point* pdestPoints = destPoints; 

//在指定区域pdestPoints显示图像 

graphics.DrawImage(&image, pdestPoints, 3); 



在编译上面的程序之前,应该将Gdiplus.lib文件连编到项目中去,否则将会出现“LINK 2001”编译错误。上述程序在Visual Studio 6.0、Windows 2000/XP下调试通过,它能够显示或转换的图像格式有BMP、GIF、JPEG、Exif、PNG、TIFF、ICON、WMF、EMF等等。需要说明的是,本文只就GDI+编程的基本原理进行了阐述,事实上,GDI+的应用远不止此。
哎,我在Linux下用QT来进行图形编程.好象对于QT来说,没有所谓的GDI+啊
郁闷......
有没有比较简单一点的方法?
其实我主要就是想知道如何自定义CPen的线型?
不知有那位大侠知道?

关于 公共网->DB1<->防火墙<->DB2<-内网 的交互问题 水晶报表运行时提示“您请求的报表需要更多信息”,请问应该如何解决? 想从INFORMIX向sql server导入数据 有去传智播客培训的吗.组团报 排序计算 如何删除数据窗口中的列,高手进,谢谢! 判断路径文件是否存在,文件路径太长怎么办? 用JavaScript实现单击大类小类随着变的功能。 请教richtextbox控件加载的问题! 这个程序为什么打印不出来 我看过了和原来的程序没有区别呀. 请大家帮帮我!!!谢谢了 继续请教各位同胞们```关于ObjectInputStream 高手帮帮小弟 怎么在PICTUREBOX 里面画图? div之间的推移问题,在ie浏览器里id=fl的div能把ad向下推移,可在firefix里就不能向下推移,请高手帮帮忙 学完c/c++能找到工作吗...都做什么啊 linux 下oracle9i无法启动【十万火急】 散点分 冰镇西瓜夏天少吃 请教一个关于IO串行化对象的问题! c#如何动态获取WebBrowser网页中鼠标的坐标 其实只有孤独的人才知道孤独的人需要什么 The value [TestAction] for attribute [action] in tag [form] is not valid. net cf下,DataGrid如何设置每一行的高度? *pStr 和 string 在用时候的区别 问个MessageBox.show后主窗体自动关闭的问题.急。。。 sos 公司的工资管理系统,但是有一处错误一直没找到 无法提交断点 LineBreakpoint BingRenJishoufenxinxichaxun.java : 309,原因是:类yiyuan.BingRen 简单的JS输出问题 while 双从循环判断问题 急