3.4 Windows GDI、控件
这一节是Windows编程(www.cppentry.com)的最后一节,其中将讲解如何在Windows中使用图形设备接口界面的内容。在本节的最后一个小节中将对Windows控件的应用进行说明。
3.4.1 高级GDI编程(www.cppentry.com)
GDI从各个方面来说,还是很优秀的,并且它也是Windows系统内置的渲染引擎。也就是说,如果想创建任何工具或者标准的GDI应用程序,了解关于GDI的工作方式是很有益处的。下面就来讨论一下GDI基本的一些内容,更为复杂的内容可以浏览MSDN来深入学习。
在前面的内容中,经常看见设备描述表的类型句柄,如HDC。HDC是图形设备描述类型,当然还有其他的类型,如打印机设备描述表等。
一个图形设备描述表实际上就是对一种安装在机器上的视频图形卡的描述。实际上,在使用句柄时,就是对具体的一种设备进行操作。对于GDI的任何调用,这些信息都是必需的。从本质上来说,提供的指向任何GDI函数的HDC句柄,都是用来访问一个函数操作的设备的重要信息,这就是需要一个图形描述表的原因。
图形设备描述表要跟踪编程(www.cppentry.com)过程中任何可能改变的软件设置。比如在GDI中大量的使用画笔、画刷、线等类型。GDI使用这些基本数据类型来绘制任何图形,即使使用的画笔颜色不是视频卡的默认颜色,那么设备描述表也会跟踪它。因此,图形设备描述表不仅是硬件的描述,而且还是记录和保存设置的信息库。下面就来看一下如何使用GDI来对图形渲染。
1.画笔
下面的代码是画笔的创建方式:
这里说明的是创建一个NULL类型的画笔。hPen是一个画笔的句柄,但是hPen仍然不能使用所希望的信息来代替或删除。这样的操作可以通过下面方式中的一种完成。
(1)使用存储对象。
(2)创建一个用户定义的画笔。
需要注意的是存储对象仅仅是Windows所拥有的一些默认样式的对象。如果需要使用这些样式,可以通过函数GetStockObject()来完成。这个函数还可以取得画刷的样式。函数原型为:
HGDIOBJ GetStockObject( int fnOjbect ); |
这个函数采用希望的存储对象的样式,然后返回一个该对象的句柄。预定义的画笔存储对象,如表3-7所示。
表3-7 存储对象的样式
如果需要使用白色的画笔可以使用下面的代码:
HPEN hPen = NULL; hPen = GetStockObject( WHITE_PEN ); |
除了使用系统定义的画笔外,还可以创建自定义的画笔,函数的原型为:
HPEN CreatePen( int fnPenStyle, // 画笔的颜色 int nWidth, // 画笔的宽度 COLORREF crColor // 颜色 );
|
线条样式如表3-8所示。
表3-8 线条样式
下面是创建画笔的代码:
HPEN hPen = CreatePen( PS_SOLID, 1, RGB( 255, 0, 0 ) );
|
当完成了画笔的创建以后,还不能够画图。如果需要画图,还需要将画笔选择到图形设备描述表中。使用SelectObject()函数即可,函数原型为:
HGDIOBJ SelectOjbect( HDC hdc, HGDIOBJ hgdiobj );
|
HDC是设备环境句柄,前面已经详细说明过其作用。HGDIOBJ是一个组合类型,适用于图形对象句柄。函数返回当前的从该内容中取消选定的对象句柄。
实例3-6:创建一个画笔,并且选入到设备中进行绘图。
HDC hDC; HPEN hPen = CreatePen( PS_SOLIC, 1, RGB( 255, 0, 0 ) ); HPEN hOldPen = NULL; hOldPen = SelectObject( hDC, hPen ); // 下面可以开始画图 // ... SelectObject( hDC, hOldPen );
|
上面的代码是一个完整的使用画笔绘图的程序。对于画图部分,在3.4.2节中会详细说明。
当画笔使用完成后,需要使用函数DeleteObject()将对象删除。函数的原型为:
BOOL DeleteObject( HGDIOBJ hOjbect ); 使用的代码如下: DeleteObject( hPen ); |
2.画刷
画刷除了使用后的外观与画笔不一样外,其他都和画笔相似。因此这一部分只对不同的地方进行讲解,对于和画笔相同的部分,不再详细阐述。
画刷的定义如下:
这条语句是创建一个空的画刷。对于系统默认的画刷类型在表3-7中已经有过说明,这里省略。下面是使用默认的浅灰色画刷的代码:
hBrush = GetStockObject( LTGRAY_BURSH );
|
在画刷的创建中还可以创建纯色的画刷,其函数原型为:
HBRUSH CreateSolidBrush( COLORREF crColor );
|
下面的程序代码是一个完整的创建和使用纯色画刷的例子。
实例3-8:创建一个纯色的画刷,并且选入到设备中进行绘图。
HBRUSH hBrush = NULL; HBRUSH hOld = NULL; hBrush = CreateSolidBrush( RGB( 255, 0, 0 ) ); hOld = SelectObject( hBrush ); // 使用画刷绘图 // ... SelectObject( hOld ); DeleteObject( hBrush );
|
使用完画刷以后请记住一定要删除画刷的句柄。使用的函数仍然是DeleteObject()。除了纯色的画刷以外,还可以创建带阴影的画刷,函数原型为:
HBRUSH CreateHatchBrush( int fnStyle, COLORREF crColor ); |
fnStyle是画刷的样式类型,如表3-9所示为支持的样式。
表3-9 阴影画刷的样式
实例3-7:创建一个阴影效果的画刷,并且选入到设备中进行绘图。
HBRUSH hBrush = NULL; HBRUSH hOld = NULL; hBrush = CreateHatchBrush( HS_CROSS, RGB( 255, 0, 0 ) ); hOld = SelectObject( hBrush ); // 使用画刷绘图 // ... SelectObject( hOld ); DeleteObject( hBrush ); |
在这一小节中介绍了Window GDI的一些基本概念,并且重点讲解了画笔和画刷的定义与应用。在Windows应用程序的开发中,往往会涉及一些简单的绘图,如在界面中显示一个柱状条,那么就可以用GDI来实现,其中具体的图形绘制在3.4.2小节中将会详细的讨论。GDI是一个很重要的概念,必须要对其掌握,并能够熟练的运用。
【责任编辑:
杜书 TEL:(010)68476606】