DirectDraw是DirectX API的组成部分,用于直接操纵显示内存、硬件传输、硬件覆盖支趾头砻嬷С帧?/SPAN>DirectDraw在保持与现有基于Microsoft Windows的应用程序和设备驱动程序兼容的同时提供这些功能。DirectDraw是一个可在保持与Windows图形设备接口(GDI)兼容的同时直接访问显示设备的软件接口,不是用于图形的高级API。DirectDraw为游戏和Windows子系统软件提供了一种独立于设备的访问特定显示设备的方法,例如,3-D图形包和数字视频codecs。
Direct3D用于在运行Microsoft Windows的计算机上实现世界级游戏和交互式3-D图形。它以独立于设备的方式提供对3-D视频显示硬件的访问。Direct3D是一个用于3-D硬件的绘图接口。Direct3D有两种模式:立即模式和保留模式。保留模式是一个高级3-D API,可供需要进行快速开发或需要获得对层次和动画的内建支持的程序员使用。对需要将游戏或其他高性能多媒体应用程序移植到Windows操作系统的开发人员来说,Direct3D立即模式是一个比较理想的低级3-D API。立即模式是一种应用程序在低层次上与加速硬件进行通信的设备无关方式。Direct3D保留模式建立在立即模式之上。
15.1.1 DirectDraw
使用DirectDraw首先要创建一个代表计算机显示卡的 DirectDraw对象实例。然后用接口方法来操纵该对象。另外,必须创建一个或多个DirectDrawSurface对象实例,使其能够在图形表面上显示应用程序。
注意:要想在应用程序中成功地使用GUID,就必须在所有其他包含和定义语句之前定义INITGUID或链接到Dxguid.lib。在源模块中应只定义一个INITGUID。
本书所附光盘上的DDex1目录下的DDex1项目是一个DirectDraw例子程序,实现步骤如下。
1. 创建一个DirectDraw对象
应用程序应当使用DDex1例子程序的doInit函数中的DirectDrawCreateEx函数来创建一个DirectDraw对象的实例。DirectDrawCreateEx包括了四个参数。第一个参数是一个代表显示设备的全局惟一标识符(GUID)。GUID在大多数情况下设置为NULL,其含义是DirectDraw使用系统的默认显示驱动程序。第二个参数包括了用于标识DirectDraw对象(如果已经创建)位置的指针的地址。第三个参数是IDirectDraw7接口的引用标识,此参数必须设置为IID_IDirectDraw7。第四个参数总是设置为NULL,是为了将来扩展而保留的。
下列例子显示了怎样创建DirectDraw对象以及怎样确定创建成功还是失败:
ddrval = DirectDrawCreateEx(NULL, &lpDD, IID_IDirectDraw7, NULL);
if(ddrval == DD_OK)
{
// lpDD是一个有效的DirectDraw对象
}
else
{
// 不能创建DirectDraw对象
}
2. 确定应用的行为
在可以改变显示器的分辨率之前,必须IDirectDraw7::SetCooperativeLevel方法的dwFlags参数中至少指定DDSCL_EXCLUSIVE和DDSCL_FULLSCREEN标志。这样做使应用程序可以完全控制显示设备,其他应用程序都不能共享显示设备。
另外,DDSCL_FULLSCREEN标志将应用程序设置为独占(全屏)模式。应用程序覆盖了整个桌面,只有应用程序本身可以写到屏幕上,但是桌面仍然可用(要在以独占模式运行的应用程序中看到桌面,需要按下【Alt+Tab】)。
下列例子程序演示了SetCooperativeLevel方法的用法:
HRESULT ddrval;
LPDIRECTDRAW7 lpDD; // 已经由DirectDrawCreateEx创建
ddrval = lpDD->SetCooperativeLevel(hwnd, DDSCL_EXCLUSIVE |
DDSCL_FULLSCREEN);
if(ddrval == DD_OK)
{
// 独占模式成功
}
else
{
// 独占模式未成功,但是应用程序仍然在运行
}
如果SetCooperativeLevel没有返回DD_OK,则应用程序仍然可以运行。但是应用程序并不处于独占模式,这样可能不能满足应用程序的性能要求。在这种情况下,一般要显示一条消息让用户决定应用程序是否应该继续执行。
如果将显示模式设置为全屏独占模式,就必须将应用程序的窗口句柄传递给SetCooperativeLevel函数,以便让Windows确定应用程序是否异常终止。如果发生了一个一般保护(GP)错误并且GDI翻转到了后台缓冲区,用户将不能返回到Windows屏幕。为了防止这种情况发生,DirectDraw提供了一个在后台运行的进程,用于捕获发送给该窗口的消息。DirectDraw用这些消息来确定应用程序何时终止,但这个特色强加了一些限制——必须指定用于获取应用程序消息的窗口句柄。也就是说,如果创建了另一个窗口,必须保证所指定的窗口处于活动状态。否则可能遇到问题,包括不可预测的GDI行为,或者在按下【Alt+Tab】时没有响应。
3. 改变显示模式
在设置了应用程序的行为以后,就可以使用IDirectDraw7::SetDisplayMode方法来改变显示器的分辨率。下列例子显示了怎样将显示模式设置为640×480×8:
HRESULT ddrval;
LPDIRECTDRAW7 lpDD; // 已经创建
ddrval = lpDD->SetDisplayMode(640, 480, 8);
if(ddrval == DD_OK)
{
// 成功改变了显示模式
}
else
{
// 不能改变显示模式,不支持这种模式或另一个应用程序处于独占模式
}
在设置显示模式时,如果用户的硬件不能支持更高的分辨率,则应用程序应确保将显示模式回复到大多数显示适配器都支持的标准模式。例如,可将应用程序设计为在所有的支持640×480×8标准后备分辨率的系统上运行