12GDI+基础编程 - 图文(3)

2020-02-20 17:49

为链接器输入的附加依赖项。但是对VC08 SP1及VC10/12,该库已经成为标准链接库之一,不必再为链接器输入的附加依赖项添加此库。

因为在Gdiplus.h头文件中,将所有的GDI+的类、函数、常量、枚举和结构等都定义在了命名空间Gdiplus中。所以,一般在GDI+程序中,都应该使用如下的命名空间声明:

using namespace Gdiplus;

命名空间(namespace)是标准C++(ISO/IEC 14882:1998)中引进的一种高于类的封装层次,是若干相关类的一个集合。使用命名空间,可以避免类的命名冲突,便于大型开发项目的管理和编程。在程序中可用(作用域解析运算符)双冒号“::”来访问命名空间中的类(命名空间名::类名,如Gdiplus::Font)。对程序中常用的命名空间,可以使用using指令(using namespace 命名空间名;,如using namespace Gdiplus;)来省略作用域限定部分“命名空间名::”,而直接在程序中使用指定命名空间中的类名即可(如Font)。有关命名空间的详细内容,参见17.1.2小节的第6部分。

1.VC中的设置

为了在MFC应用程序中能使用GDI+,必须包含GDI+头文件、使用GDI+命名空间。对VC08及之前的版本,还要为项目添加GDI+链接库。

1) 包含头文件、使用命名空间——在要使用GDI+的文件(如视图类的头文件或代码

文件)头部包含GDI+的头文件:

#include

并加上使用GDI+命名空间的using指令(区分大小写,注意首字母大写):

using namespace Gdiplus;

2) 添加链接库(对VC08 SP1及VC10/12不必添加)——在VS08及其早期版本中,

选“项目/*属性”菜单项,打开项目的属性页窗口,先选“所有配置”,再选“配置属性/链接器/输入”项,在右边上部的“附加依赖项”栏的右边,键入GdiPlus.lib(参见图12-9)后按“应用”钮,最后按“确定”钮关闭对话框。

11

图12-9 在项目属性对话框中添加静态链接库(VC08及以前版本)

2.GDI+的初始化与清除

由于GDI+的底层动态链接库,并不是Windows系统的核心模块,一般不会自动装入。因此,为了在MFC应用程序中使用采用C++封装的GDI+ API,需要我们自己手工来装入和卸载GDI+的动态链接库。这可以通过在MFC项目的应用程序类中,调用GDI+命名空间中的GDI+全局启动函数GdiplusStartup和GDI+全局关闭函数GdiplusShutdown,来对GDI+进行初始化(装入动态链接库Gdiplus.dll,或使锁定标志+1)和清除(卸载动态链接库Gdiplus.dll,或使锁定标志-1)工作来完成。该启动和关闭函数,一般分别在应用程序类的InitInstance和ExitInstance重载方法中调用。

函数GdiplusStartup和GdiplusShutdown,都被定义在GdiplusInit.h头文件中,原型为:

Status WINAPI GdiplusStartup( OUT ULONG_PTR *token,

const GdiplusStartupInput *input, OUT GdiplusStartupOutput *output); void GdiplusShutdown(ULONG_PTR token);

其中:

? 类型ULONG_PTR,是用无符号长整数表示的指针,被定义在basetsd.h头文件中:

typedef _W64 unsigned long ULONG_PTR;

输出参数token(权标),供关闭GDI+的函数使用,所以必须设置为应用程序类的成员变量(或全局变量,不提倡)。

? 结构GdiplusStartupInput和GdiplusStartupOutput,都被定义在GdiplusInit.h头文件中。

12

? GDI+启动输入结构指针参数input,一般取默认构造值即可,即(设:无调试事件回调过程、不抑制背景线程、不抑制外部编解码):

input = GdiplusStartupInput(NULL, FALSE, FALSE);

? GDI+启动输出结构指针参数output,一般不需要,取为NULL即可。

注意,采用MFC进行GDI+ API编程时,在使用任何GDI+的功能调用之前,必须先调用GDI+启动函数GdiplusStartup来进行初始化GDI+的工作;在完成所有的GDI+功能调用之后,必须调用GDI+关闭函数GdiplusShutdown来进行清除GDI+的工作。

3.过程框图

图12-10是使用MFC进行GDI+编程的设置、准备与初始化过程的逻辑框图。

项目属性 添加GDI+链接库 VC10/12可省 GdiPlus.lib 定义结构变量 GdiplusStartupInput 启动GDI+ GdiplusStartup 定义类变量token ULONG_PTR 包含GDI+头文件 gdiplus.h 使用GDI+命名空间 Gdiplus 绘制GDI+图形 Graphics等 关闭GDI+ GdiplusShutdown *App.cpp *View.cpp *App.cpp InitInstance *View.cpp OnDraw等 *App.cpp ExitInstance *App.h 图12-10 GDI+的设置、准备与初始化

12.3.2 编程例

下面通过一个简单的例子(Gdip),来说明如何使用GDI+进行应用程序的开发。

1.创建和设置

先创建一个名为Gdip的传统界面MFC单文档应用程序项目,在应用程序类和视图类的CPP代码文件中,包含头文件并使用命名空间:

#include using namespace Gdiplus;

对VC08及之前的版本中,还需在项目属性的链接器输入的附加依赖项中,添加链接库GdiPlus.lib。

13

2.初始化与清除

然后再进行GDI+系统的初始化,这需要在应用程序类CGdipApp中声明一个成员变量:

ULONG_PTR m_gdiplusToken; // ULONG PTR 为int64 类型

并在该类的初始化函数InitInstance中加入以下代码来对GDI+进行初始化:

GdiplusStartupInput gdiplusStartupInput;

GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);

注意:在VC08 SP1及以前的版本中,这两个语句必须加在对应用程序基类的InitInstance函数的调用语句

CWinApp::InitInstance();

之前,不然以后会造成视图窗口不能自动重画、程序中不能使用字体等等一系列问题。

还要在CGdipApp::ExitInstance()中加入以下代码来关闭GDI+:

GdiplusShutdown(m_gdiplusToken);

上面的InitInstance和ExitInstance都是应用程序类的重写型方法。而且,默认时VC08 SP1及其以前版本是不会自动生成ExitInstance方法的代码的(不过VC10/12会自动生成此方法),需要自己利用类的属性窗口来添加(VC10/12不要手工添加)。

3.绘图

接下来就可以利用GDI+进行绘图了。下面的代码段是在OnDraw函数中画一个带网格的透明度连续变化的图:

CGdipView::OnDraw(CDC* pDC) {

……

Graphics graph(pDC->m_hDC); // 创建图形对象 Pen bluePen(Color(0, 0, 255)); // 创建蓝色笔 Pen redPen(Color(255, 0, 0)); // 创建红色笔 int y = 255; // y的初值

for (int x = 0; x < 256; x += 5) { // 绘制红蓝网线

graph.DrawLine(&bluePen, 0, y, x, 0); graph.DrawLine(&redPen, 255, x, y, 255); y -= 5;

14

}

}

// 画一组绿色透明度垂直渐变的水平线(填满正方形) for (y = 0; y < 256; y++) { }

// 画一组品红色透明度水平渐变的垂直线(填满扁矩形) for (int x = 0; x < 256; x++) { }

Pen pen(Color(x, 255, 0, 255)); // α随x变的品红色笔 graph.DrawLine(&pen, x, 100, x, 200);

Pen pen(Color(y, 0, 255, 0)); // α随y变的绿色笔 graph.DrawLine(&pen, 0, y, 255, y);

运行的结果如图12-11所示。其中,左图为第一个循环所绘制的结果、中图为前两个循环所绘制的结果、右图为全部三个循环所绘制的结果。

图12-11 透明度的连续变化

12.3.3 new问题

在VC12及以前版本中,当解决方案配置处于(默认的)调试(Debug)状态下,在使用GDI+时,不能用C++的new操作符来动态创建GDI+对象。解决办法有如下三种:

1.修改GdiplusBase类

打开(默认)位于“C:\\Program Files (x86)\\Windows Kits\\8.0\\Include\%um\\”目录中的GdiplusBase.h头文件,并注释掉里面GdiplusBase类的内容(该类其实只含new、new[]、delete和delete[]这四个运算符的重载),使其成为一个空类(但不要删除整个类)。然后,再用“生

15


12GDI+基础编程 - 图文(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:公积金养老保险等问题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: