设备描述表(简称为“DC”)实际上是 GDI(图形设备接口)内部保存的数据结构。设备描述表与特定的显示设备(如视频显示器或打印机)相关。
在窗口的客户区域显示文本和图形需要设备描述表句柄。
当您想在一个图像输出设备(诸如屏幕或者打印机)上绘图时,您首先必须获得一个设备描述表(或者DC)的句柄。将句柄返回给程序时,Windows 就给了您使用设备的权限。然后您在 GDI 中将这个句柄作为一个参数,向 Windows 标识您想在其上进行绘图的设备。
设备描述表中的有些值是图形化的“属性”,这些属性定义了一些GDI绘图函数工作情况的特殊内容。例如,对于 TextOut(hdc,x,y,psText,iLength),设备描述表的属性确定了文本的颜色、文本的背景色、TextOut函数的 x 坐标和 y 坐标映射到窗口的客户区的方式,以及显示文本时 Windows 使用的字体。
当程序需要绘图时,它必须先获取设备描述表句柄。在获取了该句柄后,Windows 用默认的属性值填充内部设备描述表结构。
可以通过调用不同的 GDI 函数改变这些默认值。
利用其它的 GDI 函数可以获取这些属性的当前值。
还有其它的 GDI 函数能够在窗口的客户区真正地绘图。
当程序在客户区绘图完毕后,它必须释放设备描述表句柄。句柄被释放后就不再有效,且不能再被使用。
程序必须在处理单个消息期间获取和释放句柄。
除了调用 CreateDC 函数创建的设备描述表之外,程序不能在两个消息之间保存其它设备描述表句柄。
Windows 应用程序一般使用两种方法来
获取窗口客户区中的设备描述表句柄,以备在屏幕上绘图。
方法一:
在处理 WM_PAINT 消息时,使用这种方法。它涉及 BeginPaint 和 EndPaint两个函数。
hdc = BeginPaint(hwnd,&ps);
[other program lines]
EndPaint(hwnd,&ps);
BeginPaint 函数包含一个类型为 PAINTSTRUCT 结构的变量ps,该结构的hdc字段是 BeginPaint 返回的设备描述表句柄。PAINTSTRUCT 结构又包含一个名为 rcPaint 的 RECT (矩形)结构,rcPaint 定义一个包围窗口客户区无效范围的矩形。使用从 BeginPaint 获得的设备描述表句柄,只能在这个区域内绘图。BeginPaint 调用使该区域有效。
方法二:
调用 GetDC 来获取句柄,ReleaseDC 来释放句柄。
hdc = GetDC(hwnd);
[other program lines]
ReleaseDC(hwnd,hdc); 这个设备描述表句柄适用于窗口句柄为 hwnd 的客户区。
GetDC 和 ReleaseDC 不使客户区中任何可能的无效区域变成有效。
Windows 程序还可以
获取适用于整个窗口(而不仅限于窗口的客户区)的设备描述表句柄:
hdc = GetWindowDC(hwnd);
[other program lines]
ReleaseDC(hwnd,hdc);
这个设备描述表除了客户区之外,还包括窗口的标题栏、菜单、滚动条和框架(frame)。GetWindowDC 函数很少使用,如果想尝试用一用它,则必须捕获 WM_NCPAINT(“非客户区绘制”)消息,Windows 使用该消息在窗口的非客户区上绘图。
获取设备描述表句柄更通用的函数调用。
BeginPaint、GetDC 和 GetWindowDC 获得的设备描述表都与视频显示器上的某个特定窗口相关。获取设备描述表句柄的另一个更通用的函数是 CreateDC:
hdc = CreateDC(pszDirver,pszDevice,pszOutput,pData);
[other program lines]
DeleteDC(hdc);
例如,可以通过下面的调用来获取整个屏幕的设备描述表句柄:
hdc = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
获取一个“信息描述表”的句柄:
有时候只是需要获取关于某设备描述表的一些信息而并不进行任何绘画,在这种情况下,可以使用 CreateIC 来获取一个“信息描述表”的句柄,其参数与 CreateDC 函数相同:
hdc = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);
不能用这个信息环境句柄往设备上写东西。
当使用位图时,
获取一个“内存设备描述表”有时是有用的:
hdcMem = CreateCompatibleDC(hdc);
[other program lines]
DeleteDC(hdcMem); 可以将位图选进内存设备描述表,然后使用GDI函数在位图上绘画。
元文件是以二进制形式存储的 GDI 命令的集合。元文件主要用于通过剪切板传输矢量图形表示。
可以通过
获取元文件设备描述表来创建元文件:
hdcMeta = CreateMetaFile(pszFilename);
[other program lines]
hmf = CloseMetaFile(hdcMeta); 在元文件设备描述表有效期间,任何用 hdcMeta 所做的 GDI 调用都变成元文件的一部分而不会显示。在调用 CloseMetaFile 之后,设备描述表句柄变为无效,函数返回一个指向元文件(hmf)的句柄。
窗口的设备描述表定义了一个剪取区域。
对于从 GetDC 获取的设备描述表句柄,默认的剪取区域是整个窗口客户区;而对于从 BeginPaint 获取的设备描述表句柄,默认的剪取区域则为窗口客户区中的无效区域。
Windows 不会在剪取区域之外的任何位置显示字符串。
获取设备描述表信息:
一个设备描述表通常是指一个物理显示设备,如视频显示器和打印机。通常需要获取有关该设备的信息,其中包括显示器的显示尺寸(单位为像素或者物理度量)和色彩范围。
可以通过调用 GetDeviceCaps(“获取设备能力”)函数来获取这些信息:
iValue = GetDeviceCaps(hdc,iIndex);