您的位置:首页 > 编程语言

GDI(图形设备接口)编程(一)设备环境的获取

2011-12-23 00:05 239 查看
GDI (Graphic Device Interface)中文解释 图形设备接口,顾名思义肯定图形设备有关,这个关联就是设备环境(也称为DC),事实上大多数GDI函数都需要传入一个HDC类型的参数,这个参数就是设备环境句柄(Window内部用来唯一标识对象的一个32位无符号整数)。设备环境句柄是程序窗口使用GDI函数的“通行证”。设备环境(DC)实际上是GDI内部维护的一个数据结构。设备环境中的某些值是图形的“属性”。这些属性决定了GDI绘图函数的细节。当程序完成了对客户区的绘制后,必须释放设备环境句柄。在程序释放完句柄后

这个句柄不再有效并且不能被使用。程序必须在处理同一条消息的过程中获取句柄和释放句柄。不能再两条消息中间传递一个设备环境句柄,唯一的例外是通过CreateDC函数创建的设备环境句柄。

获取HDC句柄主要有以下三个函数BeginPaint(),GetDC,GetWindowDC。

BeginPaint函数原型

HDC
WINAPI
BeginPaint(
HWND hWnd,
LPPAINTSTRUCT lpPaint);
与EndPaint(释放环境句柄)成对使用

第一个参数是一个窗口句柄,第二个参数是一个指向绘制信息结构的指针,返回值为设备环境句柄。BeginPaint第二个参数通常传入一个PAINTSTRUT地址,Begin函数会填充该该结构的各个字段。每个窗口都维护着一个该结构。

PAINTSTRUCT定义如下:

typedef struct tagPAINTSTRUCT
{
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL frestore;
BOOL fIncUpdate;
BYTE rgbReserved;
}PAINTSTRUCT;

程序只能使用前三个字段,其他的字段供windows内部使用。hdc字段是设备环境句柄。大多数情况下fErase字段都是FALSE。这意味着windows在先前的BeginPaint函数已经擦除了无效区域的背景(如果想自己定义背景擦除方式,必须自己处理WM_ERASEBKGND消息)。在WinMain初始化时,用于注册窗口类的WNDCLASS结构中的hbrBackground字段指定了一个画刷,windows就是用这个画刷来擦除背景的。但是如果当程序调用InvalidateRect使客户区矩形无效时,InvalidateRect的最后一个参数将指定背景是否擦除。如果参数是FALSE,Windows将不会擦除背景,同时在调用Begin函数时,PAINTSTRUC中的fErase字段的值将是TRUE。rcPaint字段是一个RECT结构类型的字段。RECT结构定义如下:

typedef struct tagRECT
{
LONG    left;
LONG    top;
LONG    right;
LONG    bottom;
} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;


rcPaint结构定义了一个无效矩形的边界。RECT的四个成员都是以像素为单位的,并且相对于客户区的左上角。

rcPaint不仅是一个无效矩形还是一个裁剪矩形。这意味着Windows将会把绘制限制在该矩形内。如果无效区域不是一个矩形,windows将会把绘制限制在这个区域内。

GetDC函数原型如下:

HDC
WINAPI
GetDC(
HWND hWnd);


与ReleaseDC成对使用。

GetDC返回的设备句柄的裁剪区是整个客户区。这意味着你可以在客户区的任意部分绘制,而不仅仅是无效区域,也就是如果不存在无效区域也没关系。与BeginPaint不同

GetDC不会使无效区域有效化。如果想整个客户区有效可以这样:

ValidateRect(hwnd,NULL);
通常GetDC和Release函数用于处理键盘和鼠标消息。使用这个函数,程序可以在收到鼠标或者键盘消息时及时地绘制客户区,而不必要生产WM_PAINT消息去刻意使客户区

部分无效化。但是在处理非WM_PAINT消息时,它仍然要收集足够的信息以便在收到WM_PAINT消息时更新显示。

GetWindowDC函数 原型如下:

HDC
WINAPI
GetWindowDC(
HWND hWnd);
与GetDC相比,GetDC返回的是客户区的设备环境句柄,而GetWindowDC返回的是整个窗口的设备句柄。程序可以使用从GetWindowDC返回的设备环境句柄在窗口标题栏输出,相应的必须处理WM_NCPAINT(非客户区绘制)消息
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: