如何获取设备描述表句柄--WIN32 api

来源:互联网 发布:子曰法语之言能无从乎 编辑:程序博客网 时间:2024/06/07 07:07

       Windows提供了几种获取设备描述表句柄的方法,如果在处理一条消息时获取了设备描述表句柄,应该在退出窗口函数之前释放它。一旦释放了句柄,它就不再有效了。


       1、最常用的获取并释放设备描述表句柄的方法是,在处理WM_PAINT消息时,使用的BeginPaint和EndPaint调用:
hdc = BeginPaint(hwnd,&ps);//other program linesEndPaint(hwnd,&ps);

变量ps是类型为PAINTSTRUCT的结构,该结构的hdc字段是BeginPaint返回的设备描述表句柄。

PAINTSTRUCT结构又包含一个名为rcPaint的RECT结构,rcPaint定义一个包围窗口客户区无效范围的矩形。使用从BeginPaint获得的设备描述表句柄,只能在这个区域内绘图。BeginPaint调用使该区域有效。


2、Windows程序还可以在处理非WM_PAINT消息时获取设备描述表句柄:
hdc = GetDC(hwnd);//other program linesReleaseDC(hwnd,hdc);

这个设备描述表使用于窗口句柄为hwnd的客户区。这些调用与BeginPaint和EndPaint的组合之间的基本区别是,利用从GetDC返回的句柄可以在整个客户区上绘图。当然,GetDC和ReleaseDC不使客户区中任何可能的无效区域变成有效。


3、Windows程序还可以获取适用于整个窗口(而不仅限于窗口的客户区)的设备描述句柄:

hdc = GetWindowDC(hwnd);//other program linesReleaseDC(hwnd,hdc);

这个设备描述表除了客户区之外,还包括窗口的标题栏、菜单、滚动条、和框架。GetWindowDC函数很少使用,如果想尝试用一用它,则必须捕获WM_NCPAINT(非客户绘制)消息,Windows使用该消息在窗口的非客户区上绘图。我们看到大部分的网络游戏的登陆器就是利用这个设备描述表句柄来完成的个性化制作。


BeginPaint、GetDC和GetWindowDC获得的设备描述表都与视频显示器上的某个特定的窗口相关。获取设备描述表句柄的另一个更通用的函数是CreateDC:
hdc = CreateDC(pszDriver,pszDevice,pszOutput,pData);//other program linesDeleteDC(hdc);


列如,可以通过下面的调用来获取整个屏幕的设备描述表句柄:
hdc = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);


有时候只是需要获取关于某设备描述表的一些信息而并不进行任何绘图,在这种情况下,可以使用CreateIC来获取一个“信息描述表”的句柄,其参数与CreateDC函数相同,列如:
hdc = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);

不可以使用这个信息环境句柄往设备上写东西。
当使用位图时,获取一个“内存设备描述表”有时是有用的:
hdcMem = CreateCompatibleDC(hdc);//other program linesDeleteDC(hdcMem);

利用这个函数可以将位图选进内存设备描述表,然后使用GDI函数在位图上绘画。
还可以获取元文件设备描述表来创建元文件:
hdcMeta = CreateMetaFile(pszFiename);//other program lineshmf = CloseMetaFile(hdcMeta);


在元文件设备描述表有效期间,任何用hdcMeta所做的GDI调用都变成元文件的一部分而不会显示。在调用CloseMetaFile之后,设备描述表句柄变成无效,函数返回一个指向元文件(hmf)的句柄。