看起来你主要在问关于Windows设备上下文的问题,答案是“是和否”。
设备上下文基本上创建了一种绘图模式——也就是说,在任何给定的时间,它将拥有当前设置的各种参数,例如:
1. 背景颜色
2. 前景颜色
3. 线条宽度
4. 线条样式
5. 字体
(还有其他很多参数)
至于是否存在绘图表面,我认为每个设备上下文都始终附带一个绘图表面。对于窗口的设备上下文的普通情况,该绘图表面将是窗口所显示的屏幕缓冲区的一部分。对于“兼容”设备上下文(例如CreateCompatibleDC的结果),它将是一个几乎无用的绘图表面——具体而言,它是一个单色像素。它将被设置为黑色或白色,具体取决于您在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所选位图兼容的位图,通常将是屏幕,因此您创建的内容将具有屏幕设置的全彩色。