获取HDC环境句柄的几种方法

来源:互联网 发布:传智播客python怎么样 编辑:程序博客网 时间:2024/05/17 01:12
对设备绘图,首先须要得到设备环境句柄(hDC),当不再使用将其释放,因此得到设备环境句柄的函数与释放设备环境句柄的函数总是成对出现在同一个消息处理过程之中的。

在程序中得到hDC的方法有几种:

方法一:BeginPaint


在处理WM_PAINT时,最常用的一种获取设备环境句柄的方法就是,使用BeginPaint函数,该函数返回设备环境的句柄,而函数EndPaint函数使用来释放改句柄的,一般代码是:
[cpp] view plain copy
 print?
  1. CASE WM_PAINT:  
  2.       hDC = BeginPaint(hwnd,&ps);  
  3.       //此处添加绘图代码  
  4.       EndPaint(hwnd,&ps);  
  5. return 0;  
其中BeginPaint的第一个参数为:窗口句柄,另一个为:PAINTSTRUCT(绘图信息结构体)结构变量的地址,其具体定义为:
[cpp] view plain copy
 print?
  1. typedef struct tagPAINTSTRUCT  
  2. {  
  3.      HDC   hdc;  
  4.      BOOL fErase;  
  5.      RECT rcPaint;  
  6.      BOOL fRestore;  
  7.      BOOL flncUpdate;  
  8.      BYTE rgbReserved[32];  
  9. }PAINTSTRUCT;  
在程序调用BeiginPaint时,windows填充该结构体的各个字段。用户程序只是使用了该结构体的前三个字段,第一个字段为:设备环境句柄,第二个字段为:标识了windows是否已经擦出了无效区域的背景,当该字段为false是那么就表示windows已经擦出了无效矩形区域的背景,如果为:true那么就表示windows没有将无效区域的背景擦出,换句话说就是:无效区域中的画面是什么现在还是什么没有改变。第三个字段为一个rect结构体,其表示出了,无效区域的范围,也就是要重绘的无效区域。
如果你要在无效区域之外绘图那么你就应该,在BeginPaint函数调用以前,用函数InvalidateRect使整个客户区无效并擦出背景。

方法二:GetDC


在程序中并不是总是在WM_PAINT中重绘无效区域,那么就不能使用BeginPaint与EndPaint的函数组合了,因为他们只能用于处理WM_PAINT消息中使用,那么在别的地方可以使用GetDC函数了获得设备环境句柄,而用ReleaseDC函数释放,对于使用GetDC得到的hDC,一般都只是在一个消息内是有效地,在该条消息结束前应当释放,当在另一条消息内还需要该句柄时,应当重新获得,

当我们的程序重画了无效区域时,那么我们必须显示的告诉系统,我们已经将无效区域变为有效了,那么就必须用函数validateRect函数将无效区域变为有效,否则系统会一直以为该区域是无效的,就会一直发送WM_PAINT消息,那么就会进入一个死循环,那么为什么在BeiginPaint与EndPaint函数的组合中我们没有告诉系统我们已经将无效区域变为有效区域了呢,那是因为BeiginPaint与EndPaint函数已经帮我们做了这个工作了,但是当我们不是用这个组合时,我们就必须自己告诉系统了,那么就必须加上对validateRect函数的调用了。

方法三:GetWindowDC


使用GetWindowDC()返回设备内容句柄,可以在程序显示的整个窗口上绘图,包括标题列、菜单、滚动条和框架

[cpp] view plain copy
 print?
  1. GetWindowDC(hwnd);  
  2. ReleaseDC(hwnd,hDc);  

以上几种种方法获取的hDC都是窗口的hDC,如果操作的是其他东西,那么这两种方法就不适合,在这时我们可以用其他的方法来获得相应的hDC,

方法四:CreateDC


当我们绘图的对象是一个设备是,那么我们可以用CreateDC函数来创建一个DC,起函数原型为:
[cpp] view plain copy
 print?
  1. HDC CreateDC(LPCTSTR lpszDrive, LPCTSTR lpszDevice, LPCTSTR lpszOutput, CONST DEVMODE *lplnitData);  
        lpszDriver:指向一个以Null结尾的字符串的指针,该字符串为显示驱动指定DISPLAY或者指定一个打印驱动程序名,通常为WINSPOOL。
        lpszDevice:指向一个以null结尾的字符串的指针,该字符串指定了正在使用的特定输出设备的名字,它不是打印机模式名。LpszDevice参数必须被使用。
  lpszOutput:该参数在32位应用中被忽略;并置为Null,它主要是为了提供与16位应用程序兼容,更多的信息参见下面的注释部分。
  LplnitData:指向包含设备驱动程序的设备指定初始化数据的DEVMODE结构的指针,DocumentProperties函数检索指定设备获取已填充的结构,如果设备驱动程序使用用户指定的缺省初始化值。则lplnitData参数必须为Null。


例如要获取整个屏幕的设备内容句柄

[cpp] view plain copy
 print?
  1. hDc = CreateDC(_T(“DISPLAY”),NULL,NULL,NULL);  
  2. DeleteDC(hDc);  

当我们面对的对象是一个位图时:我们可以用CreateCompatibleDC函数来创建一个DC,其函数原型为:
[cpp] view plain copy
 print?
  1. CreateCompatibleDC(hDC);  
参数中的hDC实用来参考的DC句柄,如果该参数为NULL,那么建立的DC将和当前屏幕的设置兼容,为了用该DC绘画一个位图,还需要用SelectObject函数将DC与位图句柄联系起来,
通最前面介绍的那四种方式一样,当一个DC用完时,我们必须将其释放,对于用CreateDC与CreateCompatibleDC函数建立的DC我们可以用DeleteDC来将其释放。

前面我们提到过我们获得DC一般做好不要让其的作用于不要超过本条消息,但是对于CreateCompatibleDC与CreateDC函数来说就没有那个限制了,用这两个函数得到DC我们可以一直使用一直到我们不再使用为止。

方法五:CreateIC


有时您只是需要取得关于某设备内容的一些信息而并不进行任何绘画,在这种情况下,您可以使用CreateIC来取得一个”信息内容”的句柄,

[cpp] view plain copy
 print?
  1. hDc = CreateIC(_T(“DISPLAY”),NULL,NULL,NULL);  

     不能用这个信息内容句柄往设备上写东西;

     使用位图时,取得一个”内存设备内容”有时是有用的

[cpp] view plain copy
 print?
  1. hdcMem = CreateCompatibleDC (hdc) ;  
  2. DeleteDC (hdcMem) ;  

     可以将位图选进内存设备内容,然后使用GDI函数在位图上绘画   

0 0
原创粉丝点击