当前位置: 首页 > 文档资料 > DirectX 中文教程 >

显示模式

优质
小牛编辑
141浏览
2023-12-01

显示模式

返回上级


  1. 关于显示模式
  2. 测定支持的显示模式
  3. 设置显示模式
  4. 恢复显示模式
  5. Mode X和Mode 13显示模式
  6. 对高分辨率和真彩色的支持

关于显示模式

返回目录

显示模式指的是显示器的当前设置,描述了显示器的分辨率和位深度,这个信息通常是由显示硬件从主页面传递给显示器的。显示模式是由三个特征定义的:宽、高、位深度。例如,大多数的显示器可以显示宽为640像素、高为480像素的图象,每一个像素的位深度是8。通常我们把这个显示模式称作640x480x8。随着显示模式的尺寸和位深度的增加,它所需要的视频RAM也随之增加。

有两种显示模式:调色板式和非调色板式。对于调色板式显示模式来说,每一个像素的颜色值是以一个相关调色板的索引值来代表。显示模式的位深度决定了调色板中可容纳的颜色数量。举例来说,在8位的调色板显示模式中,每一个像素的值从0到255,该调色板可容纳256个颜色入口。

非调色板式显示模式,就象它的名称所表示的那样,不需要使用调色板。在这种显示模式下,像素的位深度为16、24或32,每个像素分别占用2字节、3字节或4字节,用来描述像素的真实颜色。

主页面、以及在换页链中的所有页面必须符合显示模式的尺寸,位深度和像素格式(请参阅“像素格式”)。

测定支持的显示模式

返回目录

因为显示硬件(包括显示卡和显示器)的不同,不是所有的显示设备都支持所有的显示模式。要测定某系统所支持的显示模式,应该调用IDirectDraw2::EnumDisplayModes函数。设置正确的参数和标志符,IDirectDraw2::EnumDisplayModes可以列举出该系统所支持的所有的显示模式,或判断是否支持用户所指定的显示模式。该函数的第一个参数,dwFlags,控制该函数的额外选项,在大多数情况下,你应该设置dwFlags为0以表明忽略额外的选项。第二个参数,lpDDSurfaceDesc,是一个DDSURFACEDESC结构的地址,包含了要被测定的显示模式信息,通常,该参数被设为NULL,以列举出该系统所支持的所有显示模式。第三个参数,lpContext,是你想让DirectDraw传递给其回调函数的一个指针,如果在回调函数中不需要任何数据,给该参数值为NULL。最后一个参数,lpEnumModesCallback,一个应用程序定义的回调函数的地址,在DirectDraw每列举出一个显示模式的时候,该回调函数将被调用。

在调用IDirectDraw2::EnumDisplayModes时所提供的回调函数必须符合EnumModesCallback函数的原型。每当找到一个硬件所支持的显示模式的时候,DirectDraw调用该回调函数,并且传递了两个参数。第一个参数是一个DDSURFACEDESC结构的地址,包含了一个支持的显示模式的描述。第二个参数是一个应用程序定义的数据的地址,是在调用IDirectDraw2::EnumDisplayModes时所指定的第三个参数。

检查DDSURFACEDESC结构中的值以获得它所描述的显示模式,关键的成员是dwWidth、dwHeight、和ddpfPixelFormat。dwWidth和dwHeight成员代表了显示模式的长和宽,ddpfPixelFormat成员是一个DDPIXELFORMAT结构的地址,它包含了显示模式的位深度信息。

DDPIXELFORMAT结构不仅包含了显示模式的位深度,还可以告诉你该显示模式是否使用调色板,以及像素格式。如果dwFlags成员包含了PALETTEINDEXED1、DDPF_PALETTEINDEXED2、DDPF_PALETTEINDEXED4、或DDPF_PALETTEINDEXED8标志,显示模式的位深度为1、2、4或8,并且每个像素是一个相关调色板的索引。如果dwFlags成员包含了DDPF_RGB标志,那么该显示模式是非调色板式的,并且它的位深度由DDPIXELFORMAT 结构中的dwRGBBitCount成员所提供。

设置显示模式

返回目录

你可以用IDirectDraw2::SetDisplayMode来设置显示器的显示模式。该函数的前四个参数用来描述要设置的显示模式的尺寸、位深度以及显示器的刷新率。函数的第五个参数是用来指定额外的选项,目前,唯一可用的标志是DDSDM_STANDARDVGAMODE,它将使显示模式被设为Mode 13,而不是Mode X 320x200x8。如果你要设置另一种分辨率,位深度或Mode X模式,不要使用这个参数,并且将其设为0

尽管你可以指定所需要的显示模式的位深度,但是你不能指定显示硬件的像素格式。要测定显示硬件用于该位深度的RGB位掩码,在设置好显示模式之后,调用IDirectDraw2::GetDisplayMode。如果当前的显示模式不是基于调色板的,你可以从dwRBitMask、dwGBitMask和dwBBitMask中获得掩码值。

要正确的测定red、green和blue的所在的位,请参阅“DirectDraw参考手册”中的“像素格式掩码”。

显示模式可以由多于一个的应用程序改变,只要它们共享同一块显卡。只有当应用程序拥有对DirectDraw对象独占的访问,你才可以改变显示模式的位深度。当显示模式被改变的时候,所有的DirectDrawSurface对象将丢失它们的页面内存,并且对任何操作不起反应。这时,一个页面的内存必须被重新分配,调用IDirectDrawSurface3::Restore函数。

必须重声的是:DirectDraw的独占模式并不阻止其它的应用程序分配DirectDrawSurface对象,也不阻止它们使用DirectDraw或GDI的函数特性。但是,它确实阻止了其它的应用程序对显示模式或调色板的访问。

还原显示模式

返回目录

在应用程序结束的时候,你可以明确的调用IDirectDraw2::RestoreDisplayMode函数,使显示器还原到原始的显示模式。如果你使用的是IDirectDraw2::SetDisplayMode函数来改变显示模式,并且应用程序具有独占的控制级,那么,当重新设置控制级为普通时,原始的显示模式会自动还原。如果你使用的是IDirectDraw::SetDisplayMode函数,那么你必须明确的调用RestoreDisplayMode以还原显示模式。

ModeX与Mode 13显示模式

返回目录

DirectDraw同时支持Mode 13和Mode X显示模式。Mode 13是一种线性不可换页的320x200x8的基于调色板的显示模式,因为它的16进制BIOS模式编号是13,而被广泛的称之为Mode 13模式。要得到更多关于它的资料,请参阅“Mode 13的支持”。Mode X是从标准的VGA Mode 13模式演化而来的。通过使用VGA显示适配器的EGA多图象平面系统,它允许开发者使用最多可达256K字节的视频RAM(而Mode 13仅为64K)。

在Windows 95系统上,DirectDraw为所有的显示卡提供了两种Mode X模式:320x200x8和320x240x8。某些显卡同样也支持线性低分辨率模式。在这种模式中,主页面可以被锁定和直接访问,这在Mode X模式中是不可能的。

应用程序在调用IDirectDraw2::SetCooperativeLevel函数时,只有使用了DDSCL_ALLOWMODEX、DDSCL_FULLSCREEN、和DDSCL_EXCLUSIVE标志符,才能使用Mode X模式。如果没有指定DDSCL_ALLOWMODEX标志符,IDirectDraw2::EnumDisplayModes将不会列举出Mode X模式,并且调用IDirectDraw2::SetDisplayMode函数以请求一个Mode X模式,将会失败。

Windows 95和Windows NT不直接支持Mode X模式,因此,当你的应用程序处于Mode X模式时,你将无法使用IDirectDrawSurface3::Lock或IDirectDrawSurface3::Blt以锁定或Blit到主页面。你同样也不能对主页面,或GDI的屏幕设备环境使用IDirectDrawSurface3::GetDC函数。Mode X模式是在DDSCAPS结构中由DDSCAPS_MODEX标志符指定的,该结构是DDSURFACEDESC结构的一部分(DDSURFACEDESC结构是由IDirectDrawSurface3::GetCaps和IDirectDraw2::EnumDisplayModes函数返回的)。

目前,Windows NT还不能支持Mode X模式和某些线性低分辨率模式。

对高分辨率和真彩色的支持

返回目录

DirectDraw支持显示设备驱动所支持的所有屏幕分辨率和色彩位深度。DirectDraw允许应用程序改变显示模式到计算机显示驱动所支持的任何一个模式,包括24或32位色彩模式(也称为真彩色)。

DirectDraw同样也支持对真彩色页面的硬件仿真层(HEL)的Blit操作。如果显示设备驱动支持这些分辨率的Blit操作,那么硬件Blitter(位块传送器)将被用来进行视频RAM对视频RAM的Blit操作。否则,HEL将被用来完成此项操作。

Windows 95和Windows NT允许用户指定它们所使用的显示器类型。DirectDraw核对已知的显示模式与已安装的显示器所限制使用的显示模式。如果DirectDraw发现所请求的模式与显示器不兼容,对IDirectDraw2::SetDisplayMode函数的调用失败。当你调用IDirectDraw2::EnumDisplayModes函数时,只有显示器支持的模式才可以被列举出来。