当程序需要绘图时,它必须先获取设备描述表句柄。在获取了该句柄后,Windows 用默认的属性值填充内部设备描述表结构。
可以通过调用不同的 GDI 函数改变这些默认值。
利用其它的 GDI 函数可以获取这些属性的当前值。
还有其它的 GDI 函数能够在窗口的客户区真正地绘图。
当程序在客户区绘图完毕后,它必须释放设备描述表句柄。句柄被释放后就不再有效,且不能再被使用。
程序必须在处理单个消息期间获取和释放句柄。
表2-2列出了设备描述表的结构和各项缺省值,表2-3列出了设备描述表的类型,表2-4显示设备描述表的类型。
上图中:
Common设备描述表通过::GetDC,::GetDCEx,::BeginPaint来获得一个设备描述表,用毕,用::ReleaseDC或::EndPaint释放设备描述表;
Printer设备描述表通过::CreateDC创建设备描述表,用::DeleteDC删除设备描述表。
Memory设备描述表通过::CreateCompatibleDC创建设备描述表,用::DeleteDC删除。
Information设备描述表通过::CreateIC创建设备描述表,用::DeleteDC删除。
这也就是我们有时候要调用函数CreateCompatibleDC函数来创建兼容的DC,这是为了"照料"内存设备描述表!
严格来讲,设备描述表应该专指内存中的HDC句柄对应的DC结构体。
设备描述表结构的核心是位图。为什么这样说呢?我们说了设备描述表时为了兼容各种显示设备,这样对不同的显示器,设备描述表的结构是不一样的,结合内存设备描述表结构,我们可以可以知道内存设备描述表中包含的位图结构对应于实际硬件显卡的结构
如显卡支持分辨率为:1024*768,深度为32位,位面数为1
那么对应的设备描述表结构中的位图结构大小为:1024*768,深度为32位,位面数为1,每个像素点数据对应于显卡中数据区的像素点。这样在显示操作时实际上是操作DC对应的位图结构,位图结构在对应于相关显卡数据区,达到了屏蔽硬件差异性的效果。当我们使用SDK函数Bitblt最能感受到这一点。
对于256色显示,Windows还支持调色板操作,这个DC下的调色板对应于实际显卡的调色板,原理是一样的。
至于DC下的HPEN、HBRUSH和HFONT只是软件是为显示操作而构建的辅助工具。
其实对于设备描述表,更多的还是需要我们对windows操作系统的硬件比较熟悉。关于表的部分是转自《关于设备描述表》