了解设备上下文

时间:2010-05-06 01:08:53

标签: mfc device-context

作为MFC的相对新手,我看到了很多设备上下文(DC)。我隐约明白它与绘图有关,但具体内容在我能找到的任何地方都没有得到很好的解释。创建“兼容的设备上下文”是什么意思,为什么它很重要? SelectObject做了什么,以及如何首先兼容DC?

1 个答案:

答案 0 :(得分:14)

设备上下文只是一个绘图发生的地方,所以如果你有两个不同的DC,你就会在两个不同的地方绘图。有点像文件句柄。

设备上下文可以指屏幕上的不动产,或者只是驻留在内存中的位图,也可能是其他地方,这些只是我现在能想到的两个。

兼容的上下文是具有相同基础像素组织的上下文,其中每个像素的位数,每像素的字节数,颜色组织等等。内存位图设备上下文可以包含您想要的任何组织,但您的屏幕上下文将(最终)与您的图形卡上的缓冲区相关联,这将(具体取决于模式等)具有非常特定的像素组织。

具有兼容的上下文意味着在它们之间传输图像数据是有效的,因为很少或不需要数据转换。在另一个极端,如果您有256色调色板,8位地图,并且您尝试将其blit到每个像素具有每个RGBA 8位的屏幕,则每个最后一个像素将需要在复制时进行大量按摩,因此复制不兼容位图非常慢。根据Win32 SDK文档,至少BitBlt()和StretchBlt()“转换源颜色格式以匹配目标格式”,因此可以完成。

调查CreateCompatibleDC()和CreateCompatibleBitmap()作为如何创建与现有绘图上下文兼容的绘图上下文的起点。

SelectObject()控制设备上下文中当前处于活动状态的资源。上下文具有当前的笔,画笔,字体和位图。通过允许您指定更少的参数,这些使得许多其他GDI调用更简单。例如,您不必在使用TextOut()时指定字体,但如果要更改字体,那么SelectObject()就会出现。如果您向SelectObject()提供字体句柄,则返回value是有效字体的句柄,后续操作使用新字体。对于其他类型的资源,笔,画笔等,行为是相同的。