转自
研究了两天的GDI,发现太麻烦了。想到C#中的方便GDI+操作,于是查了一下,原来GDI+是COM的,新的SDK的一部分,VC也可以用。今天开始研究,把心得小结一下,所以这篇算是第一部分。
先把GDI+的资料说一下,既然是VS2008,当然MSDN里面是有的。地方是MSDN中的Platform SDK | Win32和COM开发 | Graphics and Multimedia | GDI+ 。然后是网上也比较多,google一下就行了。比较好的有,老外的这篇文章。
今天算是开了个头,说下怎么在VC中用GDI+,比C#当然是要麻烦一些,要多不少手脚。以下只为VC2008为目标,VC6这个老古董就不研究它了。1. 在“项目” | 属性 | 配置属性 | 链接器 | 输入 | 附加依赖项 | 中加上gdiplus.lib。或者在stdafx.h文件中加入编译宏#pragma comment(lib, “gdiplus.lib”)2. 在stdafx.h中加入一行#include <gdiplus.h>记得是最下面,但在#endif之前的地方。3. VC中使用GDI+必须要在使用之前和使用之后分别调用GdiplusStartup和GdiplusShutdown这两个函数,当然在MFC构架中在CWinApp子类中做这个比较好。MSDN中的例子是API方式的,下面给出的是MFC方式的。在应用程序类中加入一个成员变量ULONG_PTR m_gdiplusToken; 这个玩意在GdiplusStartup初始化后,在要GdiplusShutdown引用到。在InitInstance函数中加入// Initialize GDI+Gdiplus::GdiplusStartupInput gdiplusStartupInput;Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);当然,如果直接using namespace Gdiplus后,Gdiplus::就可以不要了。最后在ExitInstance函数中加入Gdiplus::GdiplusShutdown(m_gdiplusToken);配置到此,就可以正常使用GDI+来进行工作了。当然一般的工作还是在CView的OnPaint里面来进行,使用Graphics来进行操作就行了。4. (新增)如果在成员变量中声明一个GDI+类的指针有问题,把所有CPP中的开头关于DEBUG的宏注释掉即可。此问题 在VS2008中出现过,但在VS2005中却没有,至少我用的版本是这样的。复制一下引文中的一段代码为最后的说明,是OnPaint函数中的代码:using namespace Gdiplus; CPaintDC dc(this); Graphics graphics(dc.m_hDC); // Pen can also be constructed using a brush or another//pen. There is a second parameter - a width which defaults to 1.0fPen blue (Color(255, 0, 0, 255)); Pen red (Color(255, 255, 0, 0));int y = 256;for (int x = 0; x < 256; x += 5)...{ graphics.DrawLine(&blue, 0, y, x, 0); graphics.DrawLine(&red, 256, x, y, 256); y -= 5;} for (y = 0; y < 256; y++)...{ Pen pen(Color(y, 0, 255,0)); // A green pen with shifting alpha graphics.DrawLine(&pen, 0, y, 256, y); // The sleep is to slow it down so you can watch the effect Sleep(20);} for (x = 0; x < 256; x++)...{ Pen pen(Color(x, 255, 0, 255)); // A green pen with shifting alpha graphics.DrawLine(&pen, x, 100, x, 200); // The sleep is to slow it down so you can watch the effect Sleep(20); }