图形上下文(或中的设备上下文)封装了什么?
跨网络的各种定义一致认为,上下文封装了各种图形操作的参数。见:X11,Mac OS,Windows
尚不清楚的是上下文是否也封装了执行图形操作的内存缓冲区。
在X11条目中,提到了单独的可绘制对象、窗口和Pixmap,它们表示绘图表面。更进一步,在OpenGL GLX文档中,呈现上下文和绘图曲面之间存在着明显的分离。有趣的是,人们还说,“应用程序可以使用不同的上下文绘制到相同的表面”,“也可以使用单个上下文来呈现到多个曲面”。
发布于 2011-07-25 18:03:05
X11 GC不包含内存缓冲区,可绘制和GC都传递给所有绘图操作,并且GC可以与所有“类似”Drawable一起使用(相同屏幕上具有相同位深度的可绘图)。
然而,如今在X11中的绘图通常是由客户端使用诸如Cairo这样的库完成的,因此“真正的”答案取决于库。在Cairo的例子中,Cairo上下文确实包含一个当前的目标面,尽管您可以更改目标面。
OpenGL也有一种“当前目标”的概念,不过您也可以更改当前的目标。
如果您想概括一下,我想说,从概念上讲,上下文与缓冲区是分开的,但是为了节省输入,可以在上下文上设置一个当前缓冲区。
发布于 2011-07-25 15:44:06
特别是在Windows设备上下文中,您所问的主要问题的答案似乎是“是和否”。
设备上下文基本上创建了一种模式,在此模式下将进行绘图--也就是说,在任何给定的时间,它都将具有以下内容的当前设置:
color
(更多的事情等等)。
现在,只要有一个绘图表面:是的,我相信每个设备上下文都有一个附图面。在窗口的设备上下文的常见情况下,绘图面将是显示窗口的屏幕缓冲区的一部分。对于“兼容”的设备上下文(例如,来自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);...everything将取得成功,在某种程度上它甚至可以工作--除了你通过兼容的DC绘制的所有东西都将以单色结束。这可以追溯到一个像素的单色位图。由于兼容的DC在默认情况下有一个单色位图被选中,所以当您请求一个兼容的位图时,您将得到一个指定大小的单色位图。在第一个版本中,您需要一个与原始DC中选择的位图兼容的位图,这通常是屏幕,所以您创建的内容将具有设置屏幕的全部颜色。
https://stackoverflow.com/questions/6818468
复制相似问题