在CB中举办DirectX编程(1)
当前位置:以往代写 > C/C++ 教程 >在CB中举办DirectX编程(1)
2019-06-13

在CB中举办DirectX编程(1)

在CB中举办DirectX编程(1)

副标题#e#

C++ Builder是一个可视化的C++编程情况,它为编程人员提供了一种利便高效、轻便的C++语言开拓东西,因此已为宽大C++措施员所青睐,DirectX开拓东西包是微软公司提供的一套Windows9X下开拓高机能图形、声音、输入输出和网络游戏的接口,其高效的直接硬件会见、措施与硬件设备之间的相对独立等特性,险些使得DirectX成为独一可以在Windows操纵系统下开拓游戏措施的根基东西软件。

固然C++ Builder中直接包括了一套DirectX3的开拓包,也提供了一些例程,可是这些例程没有系统化的说明,同时也不适合DirectX5以上的措施开拓。另一方面,险些所有关于DirectX开拓的书籍和文献均利用Visual C++语言描写,所以作者将本身在C++ Builder中的一些开拓履历先容给读者。

本文适合具备C++ Builder面向工具编程履历的读者,实例开拓情况为中文Windows98、C++ Builder4、DirectX6或以上的开拓东西包。

一.DirectX简介

1_1.DirectX的特性

1_2.DirectX是一种Windows情况下尺度的高机能游戏、多媒体开拓东西包,利用DirectX开拓的措施可以或许与操纵系统默契地共同成为“真正”的桌面应用措施;可以操作硬件厂商提供的驱动措施接口,充实最佳的设备机能;通过直接底层硬件操纵,实现最快速、短延时、设备无关的底层接口。

1_3.DirectX回收了组件工具模子(COM)尺度,因此对付差异工具的版本可以有差异的接口,这使得用DirectX开拓的措施在将来将获得完全兼容和支持的担保。

1_4.DirectX的布局

DirectX需要以设备无关的要领提供设备相关的机能,所以DirectX的布局是由两个驱动措施组成:硬件抽象层(HAL)和硬件模仿层(HEL),当Direct工具建设时,会同时成立一张“兼容表”,个中记录了当前硬件系统支持的成果,当DirectX需要实现某个成果时就查询该表,获得硬件对成果的支持信息,假如成果可以或许获得硬件支持,则向HAL发出求,以获得硬件的支持,不然向HEL发出请求,以模仿方法实现成果。

1_5.DirectX的主要构成

(1)DirectDraw:直接会见图形硬件,打点用于显示的内存(显示内存和系统内存),提供高速图形和页面切换动画;

(2)Direct3D:提供3D硬件接口;

(3)DirectInput:主要支持输入处事,同时支持输出设备;

(4)DirectSound:提供3D声音结果,打点声卡内存;

(5)DirectPlay:提供网络多人游戏的通讯、组织成果;

(6)DirectSetup:自动安装DirectX驱动措施。

本文将凭据DirectX的上述构成,别离以实例先容其在C++ Builder中的实现要领。

二.DirectDraw措施设计

2.1 DirectDraw实现的基本—显示方法的配置

设计图形措施首先碰着的问题是将屏幕配置成一种符合的图形显示方法,然后把图形绘画到屏幕页面上。假如您在DOS下开拓图形应用措施,这将是很简朴的事,只要挪用DOS的间断处事措施即可实现,可是利用用DirectDraw就较量巨大。由于DirectDraw的设计方针是提供设备无关的编程接口和高效、多成果的硬件会见支持,所以DirectDraw需要思量更多的问题。

DirectDraw在Windows情况下支持两种图形方法:全屏幕独有方法和窗口方法。这里我先以全屏幕独有方法,先容DirectDraw配置屏幕显示方法步调,函数详细利用名目和编程要领将在2.2中先容:

2.1.1 选择硬件设备

计较机系统不必然只有一个DirectDraw硬件抽象设备,譬喻,一台计较机大概有两台或更多的显示器,那么DirectDraw工具与哪个HAL对应呢?我们可以利用DirectDrawEnumerate函数来列举系统所有已安装的设备,以供选择,并返回设备的独一标识GUID。DirectDraw默认主显示设备的GUID为NULL;

2.1.2 建设DirectDraw工具

由于DirectX是利用面向工具的措施设计技能,因此,利用DirectDraw编程就首先要建设DirectDraw工具。利用DirectDrawCreate函数及将第一步得到的设备GUID作为参数可以建设基于所选设备的DirectDraw工具;

2.1.3 获取DirectDraw更高版本的COM接口

假如您不规划利用DirectX5以上版本提供的成果则可以跳过本步调,不然必需利用新建设DirectDraw工具的QueryIntrface要领来得到IDirectDraw2或更高的COM接口。在2.2例中将先容如何得到DirectX5以上版本提供的IDirectDraw2接口;

2.1.4 配置协作级别

协作方法可以节制措施与系统其他应用措施之间的交互干系,典范的例子是:配置为全屏独有方法照旧窗口普通方法。配置协作级别可以用DirectDraw工具的SetCooperativeLevel要领;

2.1.5 列举设备支持的各类显示方法,选择并配置符合的显示分辩率、色彩深度和刷新频率等。

利用DirectDraw的EnumDisplayModes要领可以列举设备支持的所有图形方法供用户选择,在某些已确定图形显示方法的应用措施中可以通过此列举成果来查抄系统设备是否支持指定的图形显示方法。

利用DirectDraw的SetDisplayMode要领可以配置所需要的图形显示方法。


#p#副标题#e#

2.2 用DirectDraw配置屏幕图形显示方法的实例

#p#分页标题#e#

此刻我们开始编写第一个示例措施“配置全屏幕独有图形显示方法的措施”dx1,首先我们将在这里接头C++ Builder中举办DirectX编程的有关问题,然后再具体先容实现措施每一步调的相关技能。

2.2.1 dx1措施运行进程先容

dx1是按照DirectDraw配置屏幕图形方法的进程设计的,运行界面如图2.1所示。在窗口右边有六个成果按钮,它们凭据屏幕图形显示方法配置实现的步调自上而下分列,措施开始运行时,除第一个按钮“显示设备的列举”是可用的,其它按钮均不行用。由于用户必须凭据牢靠的步调操纵,所以,当一个按钮任务完成后,dx1措施会将下一步任务的

图2.1 dx1 屏幕显示方法配置措施运行界面

按钮设为可用。

按下“显示设备列举”按钮后,窗口左上方“运行状态”对应的文本框中将显示任务完成环境,若乐成则显示“Enumerate devices OK!”,不然显示“Enumerate devices failed!” ,同时在状态组中的设备列举下拉框中可以看到列举的设备(一般系统只有一个”主显示设备—Display);确定设备列举选择为“主显示设备”后,可以举办“建设DirectDraw工具”、“得到COM的IDIRECT2接口”、“配置协作级别”,每个步调的运行状态城市显示在“运行状态”右边的文本框中;在执行了“DDraw2显示模式的列举”后,状态组下方“显示模式DDraw2”下拉框中将列出所有显示设备支持的显示方法,选择需要的图形显示方法,再按“配置DDraw2”的显示方法,屏幕就会立即切换为指定的显示方法。

2.2.2 dx1编程实现

启动C++ Builder后在窗口Form1中设计如图2.1的操纵界面,各工具相关属性配置如表2.1:

控件工具范例 控件工具名称  相关属性   属性值

TForm     Form1     Caption    DirectX 操练措施1

TLabel    Label1     Caption    运行状态:

TLabel    Label2     Caption    设备的列举

Tlabel    Label3     Caption    显示模式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" 头文件。

此刻可以开始编写代码了,我们凭据按钮的顺序逐个实现每个步调的任务。

#p#副标题#e#

2.2.2.1 设备的列举

DirectDraw提供了一个函数DirectDrawEnumerate 来实现设备列举成果,此函数的挪用名目为:

HRESULT DirectDrawEnumerate (LPDDENUMCALLBACK lpcallback LPVOID lpContext)

(1)参数lpcallback是一个回调函数的地点指针。所谓回调函数是措施员本身编写的函数,当列举函数每列举一个设备时就挪用这个回调函数一次,并把当前列举的设备有关信息通过参数通报给回调函数处理惩罚。

#p#分页标题#e#

在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();

#p#副标题#e#

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

2.2.2.5 DDraw2显示模式的列举

操作HRESULT IDIRECTDRAW2::EnumDisplayModes要领及其相应的回调函数可以列出系统显示设备所支持的显示方法。您开拓的应用措施可以鉴定当前运行的计较机是否支持所需的显示方法,也可以提供用户选择显示方法的成果。

lpDD2->EnumDisplayModes(DWORD dwFlag,

LPDDSURFACEDESC lpDDSurfaceDesc,

LPVOID lpContext,

LPDDENUMMODESCALLBACK EnumDisplayModesCallBack

(1)参数dwFlag是符号参数,可觉得DDEDM_REFRESHRATES(列举差异刷新频率的刷新模式)和DDEDM_STANDARDVGAMODES(列举模式中包括Mode13)两者之一或之和,在dx1措施中回收了后者。

(2)参数lpDDSurfaceDesc是一个过滤显示模式的布局,只要配置为NULL就可以得到全部显示模式的列举,不然只得到满意指定模式的列举。

LPDDSURFACEDESC是一个布局,个中包括了显示模式有关信息,主要有:

屏幕点阵 DWORD dwWidth、DWORD dwHeight;

色彩深度 DWORD ddpfPixelFormat.dwRGBBitCount

屏幕刷新频率 DWORD dwRefreshRate

(3)参数lpContex为用户上下文变量,设为NULL就可以了。

(4)参数EnumDisplayModesCallBack为回调函数指针,该回调函数划定有如下参数名目:

BOOL WINAPI EnumDisplayModesCallBack(LPDDSURFACEDESC lpDDSurfaceDesc

LPVOID lpContext)

个中:lpDDSurfaceDesc为当前所列举显示模式的信息,lpContext为用户上下文变量。

在dx1措施中,此回调函数认真将每次回调的显示模式信息显示到ComboBox2中,并记录到一个布局数组DisplayModes中。

2.2.2.6 配置DDraw2的显示方法

每当用户选择了一个显示模式并点击“配置DDraw2的显示方法”按钮后,dx1将利用RESULT IdirectDraw2::SetDisplayMode要领改变显示方法。

lpDD2->SetDisplayModes(DWORD dwWidth,

DWORD dwHeight,

DWORD dwRGBCount,

DWORD dwRefreshRate,

DWORD dwFlags)

(1)参数dwWidth和dwHeght为显示指定方法的点阵。

(2)参数dwRGBCount为颜色深度,如:8(256色)、16(16位色)、24(真彩色)。

(3)参数dwRefreshRate为刷新频率,不体贴时可以配置为0。

(4)参数dwFlags为利用DDSDM_STANDARDVGAMODE来配置Mode13。在dx1措施中始终设为0。

#p#分页标题#e#

需要留意的是在IdirectDraw接口中,配置显示模式要领不支持dwRefreshRate和dwFlags这两个参数,所以,在有些资料中(包罗C++Builder4的示例)均只先容了DirectX3支持的IDirectDraw::SetDisplayMode(dwWidth,dwHeight,dwRGBCount)要领,请读者留意它们的区别。

2.2.2.7 退出dx1措施需要做的事

不要健忘释放lpDD2接口。LpDD2->Release();

    关键字:

在线提交作业