代码之家  ›  专栏  ›  技术社区  ›  Smashery

了解设备上下文

  •  6
  • Smashery  · 技术社区  · 15 年前

    作为mfc的新手,我经常看到设备上下文(dcs)。我模模糊糊地明白这与绘画有关,但具体细节在我能找到的任何地方都没有很好的解释。创建“兼容设备上下文”意味着什么,为什么它很重要?selectobject是做什么的,我必须首先使dc兼容吗?

    1 回复  |  直到 15 年前
        1
  •  11
  •   JustJeff    15 年前

    设备上下文只是绘图发生的地方,因此如果有两个不同的DC,则在两个不同的地方绘图。有点像文件句柄。

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

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

    具有兼容的上下文意味着能够高效地在它们之间传输图像数据,因为只需要很少或根本不需要翻译数据。在另一个极端,如果你有一个256色的调色板,8位的地图,你试图把它blit到一个屏幕上,每个像素有8位rgba,每最后一个像素将需要大量的按摩,因为它是复制的,所以复制不兼容的位图是非常慢的。根据win32 sdk文档,至少bitblt()和stretchblt()“将源颜色格式转换为与目标格式匹配的格式”,因此可以这样做。

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

    selectobject()控制设备上下文中当前活动的资源。上下文具有当前笔、画笔、字体和位图。通过允许您指定更少的参数,这使得许多其他gdi调用更加简单。例如,在使用textout()时不必指定字体,但如果要更改字体,selectobject()就是在这里输入的。如果给selectobject()一个字体句柄,则返回值是有效字体的句柄,后续操作使用新字体。其他种类的资源、笔、画笔等的行为都是一样的。

    推荐文章