Windows提供了几种获取设备描述表句柄的方法。如果在处理一条消息时获取了设备描述表句柄,应该在退出窗口函数之前释放它(或者删除它)。一旦释放了句柄,它就不再有效了。对于打印机设备描述表句柄,规则就没有这么严格(这里不讲述它)
一
最常用的获取并释放设备描述表句柄的方法是,在处理WM_PAINT消息时,使用如下代码:
hdc=BeginPaint(hwnd,&ps);
{其它代码}
EndPaint(hwnd,&ps);
变量ps是类型为PAINTSTRUCT的结构,该结构的hdc字段是BeginPaint返回的描述表句柄。PAINTSTRUCT结构又包含一个名为rcPaint的RECT(矩形)结构,rcPaint定义一个包围窗口客户区无效范围的矩形。使用从BeginPaint获得的设备描述表句柄,只能在这个区域绘图。BeginPaint调用使该区域有效。
二
Windows程序还可以在处理非WM_PAINT消息时获取设备描述表句柄,如下代码:
hdc=GetDC(hwnd);
{其它代码}
ReleaseDC(hwnd,hdc);
这个设备描述表适用于窗口句柄为hwnd的客户区。这些调用与BeginPaint和EndPaint的组合之间的基本区别是,利用从GetDC返回的句柄可以在整个客户区上绘图。当然,GetDC和ReleaseDC不使客户区中任何可能的无效区域变成有效。
三
Windows程序还可以获取适用于整个窗口(而不仅限于窗口的客户区)的设备描述表句柄,如下代码:
hdc=GetWindowDC(hwnd);
{其它代码}
ReleaseDC(hwnd,hdc);
这个设备描述除了客户区之外,还包括窗口的标题栏、菜单、滚动条和框架(frame)。GetWindowDC函数很少使用,如果想尝试用一用它,则必须捕获WM_NCPAINT(“非客户绘制”)消息,Windows使用该消息在窗口的非客户区上绘图。
四
BeginPaint、GetDC和GetWindowDC获得的设备描述表都与视频显示器上的某个特定窗口相关。获取设备描述表句柄的另一个更通用的函数是CreateDC,如下代码:
hdc=CreateDC(pszDriver,pszDevice,pszOutput,pData);
{其它代码}
DeleteDC(hdc);
例如,您可以通过下面的调用来获取整个屏幕的设备描述句柄:
hdc=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
在窗口之外写东西一般是不合适的,但对于一些不同寻常的应用程序来说,这样做很方便(您可以通过在调用GetDC时使用一个NULL参数,从而获取整个屏幕的设备描述表句柄,不过这一事实并没有载入文档)。
有时您只是需要获取关于某设备描述表的一些信息而并不进行任何绘画,在这种情况下,您可以使用CreateIC来获取一个“信息描述表”的句柄,其参数与CreateDC函数相同,例如:hdc=CreateIC(TEXT("DISPALY",NULL,NULL,NULL);
您不能用这个信息环境句柄往设备上写东西。
当使用位图时,获取一个“内存设备描述表”有时是有用的:
hdcMem=CreateCompatibleDC(hdc);
{其它代码}
Delete(hdcMem);
您可以将位图选进内存设备描述表,然后使用GDI函数在位图上绘画。(以后讲)
前面已经提到过,元文件是一些GDI调用的集合,以二进制形式编码。我们可以通过获取元文件设备描述表来创建无文件:
hdcMeta=CreateMetaFile(pszFilename);
{其它代码}
hmf=CloseMetaFile(hdcMeta);
在元文件设备描述表有效期间,任何用hdcMeta所做的GDI调用都变成元文件的一部分而不会显示。在调用CloseMetaFile之后,设备描述表句柄变为无效,函数返回一个指向元文件(hmf)的句柄。以后讨论元文件。