今天准备重新对GDI的知识进行回顾一下,以便加深认识。
一、GDI
在进行Windows编程时,可能经常会用到设备描述表的类型句柄,例如,最厂家的HDC,它就是图像设备描述类型句柄。因为GDI的绘图函数基本上都是有状态的,因此GDI所有的函数都要求一个这样的图形设备描述类型的句柄——HDC。而一个图像设备描述表实际上就是对一种安装在机器上的图形卡的描述。在使用句柄时,其实就是对具体的一种设备进行操作。对于GDI的任何函数的调用,这个设备的信息是必需的。
从本质上来说,提供指向任何GDI函数的HDC句柄,都是用来访问一个函数操作设备的重要信息。这就是需要一个图形描述表的原因。
图形设备描述表要跟踪编程过程中任何可能改变的软件设置。比如,在GDI中被大量使用的字体、画笔、画刷、线、点、矩形等类型。GDI使用这些基本数据类型来绘制任何图形,即使使用的画笔颜色不是视频卡的默认颜色,那么设备描述表也会跟踪它。因此,图形设备描述表不仅是硬件的描述,而且还是记录和保存设置的信息库。
二、CDC类
CDC类就是MFC把DC(设备描述环境)和一些GDI函数填充装到一起的一个集合。它是CObject的直接派生类。并且从CDC又派生出了许多其他类,如最常用的窗口客户区DC所对应的CClientDC类,OnPaint和OnDraw消息响应函数的输入参数中使用的CPaintDC类,图元文件对应的CMetaFileDC类和整个窗口所对应的CWindowDC类。CDC类中有许多成员函数,可以用来设备各种绘图环境、属性和参数,以及绘制各种图形和图像。
常见的函数如下:
(1)用于获取DC句柄的函数GetDC()
每次调用GetDC函数所获得的DC,都是一个全新的临时默认DC,具有默认的绘图环境和设置。它不能用任何变量临时保存,而且GetDC后原来选入的各种GDI对象全部作废,原来设置的各种状态也失效,一切都要从头开始。
(2)用于获取DC安全句柄的函数GetSafeHdc()
其获得的DC在窗口的存在期间内一直是有效的。
(3)用于释放DC的函数ReleaseDC()
三、GDI对象
3.1 画笔类
使用构造函数创建
CPen(
int nPenStyle,
int nWidth,
COLORREF crColor
)
用CreatePen函数创建画笔对象
HPEN CreatePen(int fnPenStyle, int nWidth, COLORREF crColor);
用CETStockObject函数直接创创建画笔
HGDIOBJ GetStockObject ( int fnObject )
用CreatePenIndirect函数创建
HPEN CreatePenIndirect( const LOGPEN * logopen );
3.2 画刷类
CBrush(
int fnStyle
COLOREF crColor
)
HBRUSH CreateHatchBrush(int fnStyle, COLORREF crColor);
GetStockObject()
HBRUSH CreateBrushIndirect(CONST LOGBRUSH *lplb);
typedef struct tagLOGBRUSH
{
UINT lbStyle;
COLORREF lbColor;
LONG lbHatch;
} LOGBRUSH
3.3 字体类
3.4 点类
typedef sturct tagPOINT
{
LONG x;
LONG y;
}POINT;
3.5 大小类
typedef struct tagSIZE
{
LONG cx;
LONG cy;
}SIZE;
参考文章:
1. Visual C++ 典型模块与项目实战大全