📄 bcjq103.txt
字号:
显示模式DDraw2
TEdit
Edit1
Text
(空)
ReadOnly
true
TGroupBox
GroupBox1
Caption
状态
TCombBox
ComboBox1
Text
(空)
TCombBox
ComboBox2
Text
(空)
TGroupBox
GroupBox2
Caption
协作级别
TCheckBox
CheckBox1
Caption
DDSCL_ALLOWMODEX
TCheckBox
CheckBox2
Caption
DDSCL_ALLOWREBOOT
TCheckBox
CheckBox3
Caption
DDSCL_EXCLUSIVE
Checked
true
TCheckBox
CheckBox4
Caption
DDSCL_FULLSCREEN
Checked
true
TCheckBox
CheckBox5
Caption
DDSCL_NORMAL
TCheckBox
CheckBox6
Caption
DDSCL_NOWINDOWCHANGES
Checked
true
TButton
Button1
Caption
设备的枚举
TButton
Button2
Caption
创建DirectDraw对象
Enabled
false
TButton
Button3
Caption
获得COM的IDIRECT2接口
Enabled
false
TButton
Button4
Caption
设置协作级别
Enabled
false
TButton
Button5
Caption
DDraw2显示模式的枚举
Enabled
false
TButton
Button6
Caption
设置DDraw2的显示方式
Enabled
false
表2.1 dx1控件对象属性设置一览表
确定已安装了DirectX5以上的SDK,且在C++Builder中已经将Project/Options/中标签页“Directories/Conditionals”上的“Include
Path”和“Library Path”添加了DirectX5或以上SDK的路径。
在窗口模块中包含 #include
"ddraw.h" 头文件。
现在可以开始编写代码了,我们按照按钮的顺序逐个实现每个步骤的任务。
2.2.2.1 设备的枚举
DirectDraw提供了一个函数DirectDrawEnumerate
来实现设备枚举功能,此函数的调用格式为:
HRESULT DirectDrawEnumerate (LPDDENUMCALLBACK
lpcallback LPVOID lpContext)
(1)参数lpcallback是一个回调函数的地址指针。所谓回调函数是程序员自己编写的函数,当枚举函数每枚举一个设备时就调用这个回调函数一次,并把当前枚举的设备有关信息通过参数传递给回调函数处理。
在dx1程序中,回调函数命名为EnumDeviceCallBack,负责将每次枚举出的设备的描述和名称加入到ComboBox1的列表中去,并把设备标识地址指针保存到一个lpDevices数组中以便创建DirectDraw对象时使用。
(2)参数lpContext是一用户定义的上下文变量,我们仅取值NULL就可以了。
(3)DirectDrawEnumerate为回调函数指针,该函数的格式为:
BOOL WINAPI EnumDeviceCallBack (GUID FAR *lpGUID,
LPSTR lpDevice,
LPSTR lpDeviceName,
LPVOID lpContex)
其中:参数lpGUID
为当前枚举设备标识地址指针;参数lpDevice
为设备描述的地址指针;参数lpDeviceName
为设备名称的地址指针;参数 lpContext
为上下文变量地址指针,这里我们不使用它。在dx1程序中,此回调函数负责将所枚举设备的名称和描述显示在ComboBox1中,并将设备标识地址保存到lpDevices数组中。为了简化程序,这里的lpDevices数组只采用了静态数组,最多允许保存10个元素。后面在保存显示模式枚举信息时使用的DisplayModes数组也是为了简化程序,在实际编程时可以考虑动态分配。
需要说明的是,回调函数应该是一个独立的函数,不要把它们声明为窗口类的成员函数(否则回调不能进行),而只要声明为普通函数就可以了。
2.2.2.2 创建DirectDraw对象
在进行DirectDraw编程之前,必需首先用DirectDrawCreate函数创建DirectDraw对象,并获得该对象的入口指针。该函数格式如下:
HRESULT DirectDrawCreate(GUID FAR *lpDD,
LPDIRECTDRAW FAR &lplpDD,
Iunknown FAR *p)
(1)参数lpDD为指定的设备标识指针(为NULL时是主设备),在dx示例程序中的第一个按钮“设备的枚举”采用静态数组保存枚举设备的标识指针,在第二个按钮创建DirectDraw对象时,可根据用户在ComboBox1中的选择,提供一个设备标识指针,以便对该设备创建DirectDraw对象。
(2)参数 lplpDD 为对象创建成功后的获得IditrctDraw接口指针。
(3)参数p未使用,直接为NULL。
2.2.2.3 获得COM的IDIRECT2接口
由于DirectX采用了对象组件模型COM技术(这里不再介绍),因此如果我们需要使用DirectX5或以上版本提供的功能,就需要获得更高的IDirectDraw接口,例如:如果我们使用DirectX5开发包,就需要获得IDirectDraw2接口。
可以利用HRESULT IdirectDraw::QueryInterface方法获得高版本接口:
lpDD->QueryInterface(IID_IDirectDraw2,
(LPVOID *)LPDIRECTDRAW2 &lpDD2)
参数IID_IDirectDraw2是一个常量。
lpDD2是为获得的IdDrectDraw2接口指针。
如果您需要使用更高版本的开发包,也可以用此方法获得IDirectDraw3或更高的接口。高版本接口获得后,就可以释放低版本的接口了,方法是:lpDD->Release();
2.2.2.4 设置协作级别
玩过DirectX游戏的朋友可能都领略过“全屏独占”和“窗口”两种图形模式,这就可以称为不同的协作级别,它控制应用程序与系统及其它应用程序的交互程度,因此我们必需用HRESULT
IDIRECTDRAW2::SetCooperateLevel方法设置应用程序的协作级别。
LpDD2->SetCooperateLevel(HWND handle,DWORD
dwFlag)
(1)参数handle是当前应用程序窗口的句柄,在C++Builder中,TForm类的Handle属性就是当前应用程序窗口的句柄。
(2)参数dwFlag是协作标志,可以为表2.2中定义之一或多个之和。
序号
标志
说明
(1)
DDSCL_ALLOWMODEX
允许使用Mode X模式。必须与(3)、(4)组合使用
(2)
DDSCL_ALLOWREBOOT
当使用(3)、(4)时允许用户进行热启动
(3)
DDSCL_EXCLUSIVE
使用独占方式,与(4)一起使用
(4)
DDSCL_FULLSCREEN
全屏方式,与(3)一起使用
(5)
DDSCL_NORMAL
以普通应用程序窗口方式运行
(6)
DDSCL_NOWINDOWCHANGES
DirectDraw不能自动最小化或恢复窗口
表2.2 dwFlag标志定义
在我们的dx1示例程序中,默认设置为:
DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN|DDSCL_NOWINDOWCHANGES
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -