GDI简介

来源:互联网 发布:录屏王软件破解版 编辑:程序博客网 时间:2024/06/08 05:17

要在窗口的客户区绘图,可以使用Windows的图形设备接口(GDI)函数。Windows提供了几个GDI函数,用于将文本串输出到窗口的客户区内。目前最为普遍的文本输出函数是TextOut。该函数的格式如下:

TextOut(hdc,x,y,psText,iLength);

TextOut向窗口的客户区写入字符串。psText参数是指向字符串的指针,iLength是字符串的长度。x和y参数定义了字符串在客户的开始位置。hdc参数是“设备描述表句柄”,它是GDI的重要部分。实际上,每个GDI函数都需要将这个句柄作为函数的第一个参数。

 

参数一:设备描述表句柄

设备描述表句柄是GDI函数的窗口“密码”,有了这种设备描述表句柄,程序员就能自如地在客户区上绘图,使图形如自己所愿地变得好看或者难看。

设备描述表(简称为“DC”)实际上是GDI内部保存的数据结构。设备描述表与特定的显示设备(如视频显示器或打印机)相关。对于视频显示器,设备描述表总是与显示器上的特定窗口相关。

当程序在客户区绘图完毕后,它必须释放设备描述表句柄。句柄被程序释放后就不再有效,且不能再被使用。程序必须在处理单个消息期间获取和释放句柄。除了调用CreateDC创建的设备描述表之外,程序不能在两个消息之间保存其他设备描述表句柄。

Windows应用程序一般使用两种方法来获取设备描述表句柄,以备在屏幕上绘图,如下所示两点:

方法一:

在处理WM_PAINT消息时,使用这种方法,它涉及BeginPaint和EndPaint两个函数,这两个函数需要句柄(作为参数传给窗口过程)和PAINTSTRUCT结构的变量(在WINUSER.H头文件中定义)的地址为参数。Windows程序员通常把这一结构变量命名为ps,并且在窗口过程中定义它:PAINTSTRUCT ps;

在处理WM_PAINT消息时,窗口过程首先调用BeginPaint。BeginPaint函数一般在准备绘制时导致无效区域的背景被擦除。该函数也填入ps结构的域。BeginPaint返回的值是设备描述表句柄,这一返回值通常被保存在被叫做hdc的变量中。它在窗口过程中的定义如下:HDC hdc;

HDC数据类型定义为32位的无符号整数。然后,程序就可以使用需要它的GDI函数。

调用EndPaint即可释放设备描述表句柄。所以必须成对地调用BeginPaint和EndPaint。

特殊情况:如果窗口过程不处理WM_PAINT消息,则它必须将WM_PAINT消息传递给Windows中DefWindowProc(默认窗口过程),DefWindowProc以下列代码WM_PAINT消息:

case WM_PAINT: BeginPaint(hwnd,&ps);EndPaint(hwnd,&ps);return 0;

这BeginPaint和EndPaint调用序列中没有任何语句,仅仅使先前无效区域变为有效。

 

参数二 和  参数三:x和y参数定义了字符串在客户的开始位置。

 

参数四:绘图信息结构 PAINTSTRUCT,其定义如下

typedef struct tagPAINTSTRUCT {
    HDC         hdc;
    BOOL        fErase;
    RECT        rcPaint;
    BOOL        fRestore;
    BOOL        fIncUpdate;
    BYTE        rgbReserved[32];
} PAINTSTRUCT, *PPAINTSTRUCT, *NPPAINTSTRUCT, *LPPAINTSTRUCT;

在程序调用BeginPaint时,Windows填充该结构的各个字段。用户程序只使用前三个字段,其他字段由Windows内部使用。

参数1:HDC hde:hdc字段是设备描述表句柄

参数2:BOOL fErase:在大多数情况下,fErase被标志为FALSE(0),这意味着Windows已经擦除了无效矩形的背景,这最早在BeginPaint函数中发生(如果要在窗口过程中自己定义一些背景的擦除,可以处理WM_ERASEBKGND消息。)Windows使用WNDCLASS结构的hbrBackground字段指定的刷子来擦除背景,这个WNDCLASS结构是程序在WinMain初始代期间登录窗口类时使用的。许多Windows程序使用白色刷子。

参数3:    RECT        rcPaint:是RECT类型的结构,其结构定义了一个矩形,其4个字段为left,top,right和bottom。(这些值都以像素点为单位)

参数4、5、6略

 

方法二:虽然最好是在处理WM_PAINT消息期间更新整个客户区,但也会发现在处理非WM_PAINT消息期间绘制客户区的某个部分也是非常有用的。或者需要将设备描述句柄用于其他目的,如获取设备描述表的信息。

要得到窗口客户区的设备描述表句柄,可以调用GetDC来获取句柄,在使用完后调用ReleaseDC:

hdc=GetDC(hwnd);  ......  ReleaseDC(hwnd,hdc);

所以GetDC和ReleaseDC函数必须成对地使用。

 

两方法的区别:与从BeginPaint返回设备描述表句柄不同,GetDC返回的设备描述表句柄具有一个剪取矩形,它等于整个客户区。可以在客户区的某一部分绘图,而不只的在无效矩形上绘图(如果确实存在无效矩形)。与BeginPaint不同,GetDC不会使任何无效区域变为有效,如果需要使整个客户区胡效,可以调用ValidateRect(hwnd,NULL);

一般可以调用GetDC和ReleaseDC来对键盘消息(如在字处理程序中)或鼠标消息(如在画图程序中)做出反应。此时,程序可以立刻根据用户的键盘或鼠标输入来更新客户区,而不需要考虑为了窗口的无效区域而使用WM_PAINT消息。不过,一旦确实收到了WM_PAINT消息,程序就必须要收集足够的信息后才能更新显示。

原创粉丝点击