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

来源:互联网 发布:华为直播软件安装 编辑:程序博客网 时间:2024/05/17 02:17

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

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

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

BeginPaint函数原型

HDCWINAPIBeginPaint(    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函数原型如下:

HDCWINAPIGetDC(    HWND hWnd);

与ReleaseDC成对使用。

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

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

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

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


GetWindowDC函数 原型如下:

HDCWINAPIGetWindowDC(    HWND hWnd);
与GetDC相比,GetDC返回的是客户区的设备环境句柄,而GetWindowDC返回的是整个窗口的设备句柄。程序可以使用从GetWindowDC返回的设备环境句柄在窗口标题栏输出,相应的必须处理WM_NCPAINT(非客户区绘制)消息




原创粉丝点击