具体查看 Windows 设备上下文,您所问的主要问题的答案似乎是“是与否”。
设备上下文基本上创建了一种绘图模式——即,在任何给定时间,它都会具有以下内容的当前设置:
- 背景颜色
- 前景色
- 线宽
- 线条图案
- 字体
(还有很多事情等等)。
现在,就绘图表面而言:是的,我相信每个设备上下文总是有一个绘图表面附加到它上面。在窗口的设备上下文的常见情况下,该绘图表面将是显示窗口的屏幕缓冲区的一部分。在“兼容”设备上下文的情况下(例如,来自 CreateCompatibleDC 的结果),它将是一个非常无用的绘图表面——特别是,它是一个单一的单色像素。它将设置为黑色或白色,具体取决于您绘制到 DC 的任何内容的整体亮度水平是否超过某个阈值(不,顺便说一下,我不记得确切的阈值)。
这确实有一个(某种)有用的目的:特别是,这意味着 DC总是“可用”——从来没有出现过抽到 DC 会失败的情况因为没有附加绘图表面。作为维护这一点的帮助,没有DeselectObject 功能——您可以使用SelectObject 选择不同的位图进入设备上下文(这也会取消原始的),但没有办法从设备上下文中取消选择一个位图而不选择另一个位图——因此它总是附加了一个绘图表面。
同时,兼容设备上下文的默认绘图表面非常接近无用,几乎可以算作根本没有附加绘图表面。
编辑:我还应该补充一点,选择到兼容设备上下文中的默认绘图表面是很多问题的根源。特别是,当您创建兼容的 DC 来进行双缓冲绘图时,您必须执行以下操作:
DC memDC = CreateCompatibleDC(windowDC);
BITMAP bmp = CreateCompatibleBitmap(WindowDC, sizeX, sizeY);
SelectObject(memDC, bmp);
但是,如果你稍微搞砸了,而是这样做:
DC memDC = CreateCompatibleDC(windowDC);
BITMAP bmp = CreateCompatibleBitmap(memDC, sizeX, sizeY);
SelectObject(memDC, bmp);
...一切都会成功,在某种程度上它甚至会起作用——除了你通过兼容的 DC 绘制的所有东西都会以单色结束。这可以追溯到那个单像素单色位图。由于兼容 DC 默认选择了单色位图,因此当您要求兼容位图时,您将获得指定大小的单色位图。在第一个版本中,您要求的位图与原始 DC 中选择的位图兼容,这通常是屏幕,因此您创建的内容将具有您的屏幕设置的全彩。