图面类型

可以在处理表面类型的上下文中查看它们。 存在以下类型:

  • 引擎管理的图面

  • 设备管理的图面 (标准格式位图)

  • 设备管理的图面 (非标准格式位图)

引擎托管的图面

引擎管理的图面:

  • 由 GDI 创建和管理。

  • 创建为与设备无关的位图, (DIB) 标准 DIB 格式之一:自上而下,其中原点位于左上角,或自下而上,其中原点位于左下角。

  • 类型为 STYPE_BITMAP。

  • 没有与图面对应的设备句柄。

标准格式位图是单平面、打包像素 (其中每个像素的数据以连续方式存储) 格式位图。 位图的每个扫描线在四字节边界上对齐。

EngCreateBitmap 函数中创建的位图采用 DIB 格式。 位图必须采用 DIB 格式,引擎才能对其进行管理。

设备管理的图面 (标准格式位图)

设备管理的表面:

  • 由调用设备驱动程序的 DrvCreateDeviceBitmap 函数创建。

  • 具有与表面关联的设备句柄 (DHSURF;有关详细信息,请参阅 SURFOBJ) 。

  • 可以是 不透明的 ,也可以 是非透明

不透明的设备管理图面是 GDI 既没有有关位图格式的任何信息,也没有对位图中位的引用。 出于这些原因,驱动程序必须至少支持 DrvBitBltDrvTextOutDrvStrokePath 函数。 此类图面的类型STYPE_DEVBITMAP。

非paque 设备管理的表面是 GDI 具有位图格式的相关信息并知道位图中位的位置的图面。 因此,驱动程序不需要实现任何绘制操作,将所有绘制操作延迟到 GDI。 此类图面的类型SYTPE_BITMAP。

要使驱动程序将设备管理的不透明位图转换为非paque 位图,它必须调用 EngModifySurface 函数。 通过此调用,驱动程序会通知 GDI 位图格式和位图在内存中的位置。

当驱动程序具有设备管理的 DIB 图面时,驱动程序可以调用 GDI 以在图面上绘制 GDI。 正在管理其自己的图面但正在使用 DIB 的驱动程序仍可以通过包装使用 EngCreateBitmap 函数创建的 DIB (在其图面周围) 来引用对 GDI 的调用。 以下步骤介绍了驱动程序如何在设备管理的 DIB 图面上绘制 GDI:

  1. 驱动程序调用 EngCreateBitmap 来创建 DIB 引擎管理的图面。

  2. 驱动程序调用 EngCreateDeviceBitmap 函数,以 (DDB) 图面(设备管理的 DIB 图面)创建与设备相关的位图。

  3. 驱动程序在内部将引擎管理的 DIB 数据保存在设备管理的 DDB 数据中。

  4. GDI 始终调用驱动程序,以通过设备管理的 DDB 数据与图面进行交互。

  5. 例如,当驱动程序从 GDI 接收调用并且无法处理调用 (时,驱动程序无法处理复杂的剪辑) ,驱动程序将检索存储在 DDB 数据中的 DIB 数据,并将 DIB 数据传递给 GDI 以呈现。

设备管理的图面 (非标准格式位图)

驱动程序可以通过调用 EngCreateDeviceSurface 函数来启用设备托管的非 DIB 图面,让 GDI 创建图面并为其返回句柄。 GDI 依赖于驱动程序来访问、控制设备管理图面的绘制以及从设备管理的图面读取。

与设备相关的位图 (DDB) (有时称为设备格式位图)是另一种非 DIB 设备托管图。 支持 DDB 以允许某些驱动程序(如 VGA 驱动程序)实现更快的位图到屏幕块传输。 DDB 还允许驱动程序绘制到屏幕外显示内存中的库位图或非 DIB 位图。 如果需要 DDB,驱动程序可以支持 DrvCreateDeviceBitmap 函数并调用 EngCreateDeviceBitmap 函数,使引擎向位图返回句柄。