在CB中进行DirectX编程(1)

2016-02-19 15:31 6 1 收藏

下面请跟着图老师小编一起来了解下在CB中进行DirectX编程(1),精心挑选的内容希望大家喜欢,不要忘记点个赞哦!

【 tulaoshi.com - 编程语言 】

  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方法可以设置所需要的图形显示方式。

  2.2 用DirectDraw设置屏幕图形显示方式的实例

  现在我们开始编写第一个示例程序设置全屏幕独占图形显示方式的程序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" 头文件。

  现在可以开始编写代码了,我们按照按钮的顺序逐个实现每个步骤的任务。

  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对象,并获得该对象的入口指针。该函数格式如下:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  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方法获得高版本接口:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  lpDD-QueryInterface(IID_IDirectDraw2,

  (LPVOID *)LPDIRECTDRAW2 &lpDD2)

  参数IID_IDirectDraw2是一个常量。

  lpDD2是为获得的IdDrectDraw2接口指针。

  如果您需要使用更高版本的开发包,也可以用此方法获得IDirectDraw3或更高的接口。高版本接口获得后,就可以释放低版本的接口了,方法是:lpDD-Release();

  2.2.2.4 设置协作级别

  玩过DirectX游戏的朋友可能都领略过全屏独占和窗口两种图形模式,这就可以称为不同的协作级别,它控制应用程序与系统及其它应用程序的交互程度,因此我们必需用HRESULT IDIRECTDRAW2::SetCooperateLevel方法设置应用程序的协作级别。

来源:http://www.tulaoshi.com/n/20160219/1609808.html

延伸阅读
标签: 浏览器
如何在火狐中进行支付   现在已有许多支付产品与支付方式,都能帮助大家在火狐浏览器中轻松进行网购支付。小编带领大家一起来体验一下两种比较常用的在线支付产品:支付宝快捷支付与财付通一点通。 体验一:使用支付宝的快捷支付功能 现在支付宝提供的快捷支付功能,能支持绝大部分银行的储蓄卡与信用卡,通过和支付宝绑定...
标签: 办公软件
大家都知道在Word中有这样一个技巧,那就是在移动图形等元素时,按住Alt键可以对元素的位置进行微调。 但现在还有一个一劳永逸的方法,可以在调整元素位置时,只使用键盘上的方向键,不用按任何辅助键,就可以随心所欲地进行,方法如下:在工具栏的空白处单击鼠标右键,在快捷菜单中选择“绘图”,调处“绘图”工具栏,(如图1)所示。通常“...
这是一篇新写的教程,首发Blueidea,最近很忙,这篇教程写好后也搁置两三天了,不过由于之前已经整理好了,发上来也只是Copy Paste的事情 ^_^ 使用Fireworks(以下简称FW)进行 图标设计 主要要留意两点: 一是FW专注于web设计,不适合创造一些过于复杂的PS效果,请期待FW CS5的PS滤镜; 二是FW的编辑方式类似于AI,如果您习惯于工作在PS类的像...
标签: PHP
  因为证书中有中文,所以需要在PHP中进行GB2312与UTF-8的互换。 网上搜索一下这方面相关资料,说是需要php_iconv.dll的支持,可是我在PHP5文件夹中根本找不到这个文件,但是奇怪的是在PHP4中有这个,然后我将PHP4中的php_iconv.dll文件,复制到system32下,却提示出现错误,我想应该也不行,毕竟PHP4和PHP5里面的文件应该不兼容。到这里...
标签: 电脑入门
通过对Word2010文档中的邮件合并收件人进行排序,可以实现按照特定顺序打印信函。用户可以在邮件合并收件人对话框中直接单击字段名称实现简单排序,或者单击字段名称右侧的下拉三角,在打开的下拉菜单中选择升序排序或降序排序命令进行排序,如图1所示。 图1 选择升序排序或降序排序命令如果用户需要对收件人进行更高级的排序,则可以在筛...

经验教程

771

收藏

85
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部