DirectDraw 核心

  这部分包含了DirectX的DirectDraw的主要信息, 有以下一些主题:


协作层(Cooperative Levels)

  在以后主题中,这部分介绍了协作层的概念及习惯用法:


显示模式

  这部分包含DirectDraw显示模式的主要内容. 有以下主题:

  • 关于显示模式

      一个显示模式是硬件设置用来描述硬件送到监视器的主平面的图象尺寸及色位深度. 显示模式由以下描述定义: 宽度, 高度, 及色位深度. 举个例子, 多数显示适配器可以显示640像素宽及480像素高, 每个像素8-Bits数据, 简言之, 这个显示模式就叫做 640x480x8. 如果增加显示尺寸及色位深度, 就需要更多的显示内存. 有两种显示模式: 调色板及非调色板. 对于调色板显示模式, 每个像素对应一个调色板中的一个索引. 色位深度决定调色板中有多少种色彩. 举例说, 8-Bits调色板显示模式, 每个像素是一个0到255的一个值. 在这种显示模式, 调色板可以包含256个通道.

      非调色板显示模式, 就象它的命名, 不使用调色板. 一个非调色板显示模式的色位深度需要指出所有的色位数来描述一个像素.

      主平面及主其他平面与显示模式的尺寸, 色位深度及像素格式相关. 详见像素格式.

  • 决定所支持的显示模式

      由于显示硬件不同, 并非所有的设备都支持所有的显示模式. 要得到系统所支持的显示模式, 调用IDirectDraw4::EnumDisplayModes 宏能获得所支持的显示模式列表或确认单一的显示模式是否支持. 宏的第一个参数dwFlags, 控制宏的额外选项: 通常将其设置为0来越过额外选项. 第二个参数, lpDDSurfaceDesc, 是DDSURFACEDESC2结构的地址, 它描述所需确认的显示模式: 你可以设置为NULL来获得所有模式列表. 第三个参数, lpContext, 是一个指针, DirectDraw依靠它来传递返回值: 如果你不需要额外返回值, 在这里使用NULL. 最后, 设置lpEnumModesCallback参数来接收DirectDraw 可调用支持的模式返回值的地址.

      调用EnumDisplayModes 后的返回值必须与EnumModesCallback 类型一致. 对于硬件支持的每一个模式, DirectDraw会返回两个参数. 第一个是描述一个支持的显示模式的DDSURFACEDESC2结构的地址, 第二个参数是你调用EnumDisplayModes时设置的程序定义参数的地址, 如果有的话. DDSURFACEDESC2结构描述了一个显示模式. 结构包含dwHeight, dwWidth, 及ddpfPixelFormat成员. dwHeight及dwWidth描述显示模式尺寸, ddpfPixelFormat成员是以DDPIXELFORMAT结构存放的包含模式的色位深度.

      DDPIXELFORMAT结构携带着模式的色位深度及是否使用调色板. 如果dwFlags成员包含DDPF_PALETTEINDEXED1, DDPF_PALETTEINDEXED2, DDPF_PALETTEINDEXED4及DDPF_PALETTEINDEXED8标志, 显示模式色位深度是1,2,4或8 Bits, 并且每个像素是调色板中的一个索引. 如果dwFlags包含DDPF_RGB, 那么显示模式是非调色板的并且其色位深度由DDPIXELFORMAT结构中的dwRGBBitCount成员提供.

  • 设置显示模式

      你可以用IDirectDraw4::SetDisplayMode 宏设置显示模式. SetDisplayMode 宏接收四个参数描述尺寸, 色位深度及刷新率. 宏使用第五个参数来设置显示模式的特殊选项: 在目前只用于区分Mode 13与Mode X 320x200x8 显示模式.

      虽然你可以说明所需显示模式的色位深度, 但你不能说明显示硬件使用色位深度的像素格式. 要决定硬件正在使用的RGB Bit屏蔽色位深度, 在设置显示模式后调用IDirectDraw4::GetDisplayMode. 如果当前的显示模式是非调色板的, 你可以检查 dwRBitMask, dwGBitMask及dwBBitMask 成员来决定当前红, 绿, 蓝的位数. 详见像素格式屏蔽.

      只要在共享显示卡时显示模式可以被多个程序改变. 你只可以通过排它访问来改变显示模式色位深度. 改变模式后所有的DirectDrawSurface 对象将会失去平面拥有的内存并不再活动. 每一个平面拥有的内存要通过使用IDirectDrawSurface4::Restore宏来恢复.

      DirectDraw排它(全屏)模式并不禁止其他程序分配 DirectDrawSurface 对象或使用DirectDraw或GDI功能. 不管怎样, 它能预防其他程序获得改变显示模式及调色板的排它访问权.

    注意:
       你只能在创建程序窗口线程中调用 IDirectDraw4::SetDisplayMode宏. 对于单线程序(多数程序),这个问题并不存在.

  • 恢复显示模式

      你可以通过调用 IDirectDraw4::RestoreDisplayMode 宏来恢复原来的显示模式. 如果显示模式是通过调用IDirectDraw4::SetDisplayMode 并且你的程序使用排它(全屏)协作层, 原来的显示模式会在你设置回普通协作层时自动恢复. (这个特性最现在 IDirectDraw2接口中提供,所有新版本接口也都提供)

      如果你使用IDirectDraw (译者按: IDirectDraw接口版本是最低的, 接下来是IDirectDraw2接口, IDirectDraw4接口) 接口, 你必须总是通过RestoreDisplayMode宏恢复原先的显示模式.

  • X(Mode X)及13(Mode 13)显示模式

      DirectDraw支持所有 Mode X 及 Mode 13(译者按:DOS下程序员对 Mode XXX的语法应该很熟, 通常是用来改变显示模式, Mode 13就是320x200x256c) 的显示模式. Mode 13是线性320x200x8 Bits 调色板显示模式, 取名自它使用BIOS模式16进制数:13. 详见Mode 13支持. Mode X是从标准 VGA Mode 13 派生出来的. 这个模式允许使用大于256千字节(KB)显存 (大于Mode 13 允许的64KB) 用于VGA显示适配器的EGA复杂图形标准系统.

      DirectDraw 为所有显示卡提供两个Mode X模式 (320x200x8及320x240x8). 一些显示卡也支持线性低解析度模式. 在线性低解析度模式, 主平面可以被锁定及直接操作. 在Mode X模式中是不可能的.

      Mode X 模式只有在调用 IDirectDraw4::SetCooperativeLevel 宏时使用 DDSCL_ALLOWMODEX, DDSCL_FULLSCREEN 及DDSCL_EXCLUSIVE 标志才可以实现. 如果DDSCL_ALLOWMODEX未指定, IDirectDraw4::EnumDisplayModes 宏将不会列举Mode X模式, 并且在使用 IDirectDraw4::SetDisplayMode 宏更改显示模式到Mode X会失败. Windows95 及Windows NT并不支持Mode X模式; 因此, 当你的程序进入Mode X模式, 你就不能使用IDirectDrawSurface4::Lock 或IDirectDrawSurface4::Blt 宏来锁定或Blit主平面. 你也不能在主平面使用诸如 IDirectDrawSurface4::GetDC宏, 或带有屏幕DC的GDI.Mode X 会在DDSCAPS2结构中的DDSCAPS_MODEX标志中指出, DDSCAPS2是DDSURFACEDESC2结构的一部分, 由 IDirectDrawSurface4::GetCaps 及IDirectDraw4::EnumDisplayModes宏返回.

  • 高解析度及真彩色

      DirectDraw 支持所有显示设备驱动程序所支持的屏幕解析度及色位深度. DirectDraw允许一个程序设置所有的驱动程序支持的模式, 包括24及32-bpp(真彩色)模式.

      DirectDraw 也支持HEL在真彩平面Blit. 如果显示驱动程序支持这些模式的Blit, 硬件Blit就会被使用于显存到显存Blit. 否则, HEL就会提供Blit.

      DirectDraw 会核对所知的显示模式是否被监视器支持. 如果 DirectDraw 认为所需显示模式与监视器不兼容, 在调用IDirectDraw4::SetDisplayMode 时会失败. 也只有能被监视器支持的模式在调用 IDirectDraw4::EnumDisplayModes宏后会被列出.


    上篇|返回|下篇

    Lucker 1999.1.10
    E-Mail: fred_cai@kali.com.cn


    云风工作室 制作