【问题标题】:Understanding Device Contexts了解设备上下文
【发布时间】:2011-02-16 04:39:12
【问题描述】:

作为 MFC 的新手,我经常看到设备上下文 (DC)。我隐约知道这与绘画有关,但是在我能找到的任何地方都没有很好地解释细节。创建“兼容的设备上下文”是什么意思,为什么它很重要? SelectObject 是做什么的,我必须如何首先使 DC 兼容?

【问题讨论】:

    标签: mfc gdi


    【解决方案1】:

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

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

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

    拥有兼容的上下文意味着在它们之间传输图像数据的效率很高,因为需要很少或不需要数据转换。在另一个极端,如果你有一个 256 调色板、8 位图,并且你尝试将它blit 到一个每个像素有 8 位 RGBA 的屏幕,那么每个最后一个像素都需要大量的按摩,因为它被复制,因此复制不兼容位图要慢得多。根据 Win32 SDK 文档,至少 BitBlt() 和 StretchBlt() “将源颜色格式转换为与目标格式匹配”,所以可以做到。

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

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

    【讨论】:

    • 谢谢!一些后续问题,然后:你可以使用不兼容的 DC,并且仍然有一个工作程序(虽然慢得多)?以及 SelectObject 是从哪里进入到 Device Context Compatibility 的概念的?
    • 这对我理解我难以理解的概念很有帮助。非常感谢。
    猜你喜欢
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 2013-12-29
    • 2017-03-23
    • 2015-07-07
    • 2020-10-16
    • 2019-05-09
    相关资源
    最近更新 更多