当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++ Builder教程

在C++ Builder中进行DirectX编程(2)

2.3 装入并显示图形文件

为了简明地说明采用DirectDraw图形文件的显示技术,我们以示例程序dx2介绍图面、图形文件装入、图形缩放、图形在图面上显示等的初步概念和实现技术。

2.3.1 DirectDraw显示图形的技术

为了显示图象,DirectDraw必需首先拥有类似画布(canvas)的绘图空间,DirectDraw并不向在DOS下那样简单地将显示缓存作为绘画的对象,而是通过DirectDraw对象创建各种不同种类的“图面”(Suerface),图面上的内容可以被应用程序自由地拷贝、组合,生成千变万化的图形。

2.3.1.1图面分以下几种类型:

(1)主图面(Primary图面):即在屏幕上显示出来的图面,就是GDI用于绘制Windows用户界面的图面。每个DirectDraw对象只能有一个主图面,主图面的尺寸、位置和格式由系统当前的显示模式决定,不能改动。

(2)后台图面(Off-screen图面):此类图面不能被直接看到。一般来说,后台图面往往用于作为游戏精灵动画、背景图形等部件的存储缓冲区。后台图面的尺寸是可以调整的,且可以有多个后台图面,其大小根据实际情况调整,不要太大或太小。一种典型的例子是:有一个精灵的动画由4张128点阵图形组成,那么可以将后台图面定义为256点的方阵,将这个动画序列存储下来读者可能认为可以创建一个比主图面大的后台图面以便保存游戏背景,这样可以方便地实现滚屏,但是,DirectDraw限制后台图面的尺寸不能比主图面大,除非系统的显示卡支持。能否实现大的后台图面我们将在以后叙述。

(3)复合图面(Complex图面)和翻转链(Flipping Chain):这种图面主要用于生成平滑动画。有关技术待制作动画时介绍。

(4)覆盖图面(Overlay图面):这是一种由硬件支持的图面,DirectDraw不能仿真。有关技术在后面介绍。

DirectDraw可以把图面创建在显示内存或系统内存中,而显示内存又分为常规显示内存和AGP加速图形接口内存。由于显示内存容量是有限的,所以每个图面具体应该创建在哪部分存储区域中应该统筹规划,一般将使用频繁,需要硬件加速或实现功能的图面安排在显示内存。如果您不指定图面创建的位置,DirectDraw将首先在常规显示内存创建图面,当常规显示内存不够时,若系统支持AGP内存,则先使用AGP内存,最终使用系统内存。

2.3.1.2 图形文件的装入

图形文件装入到图面并不象想象的那么简单,因为装入的图形的点阵可能与、图面的点阵不同,这就存在图形的缩放。另外,图形数据在内存中的移动、复制,也是需要处理的内容。对于Windows的设备无关位图,我们可以考虑使用Windows的功能实现:

(1)采用LoadImage函数装入图形文件

(2)采用图面的GetDC方法获得图面与GDI兼容的设备上下文

(3)采用BitBlt函数将图形数据拷贝到图面中

有关GDI编程请参看有关Windows编程资料,这里读者只需要知道固定的用法就可以了。

2.3.1.3 图面的丢失

在DirectDraw应用程序被最小化、屏幕显示方式改变或用户按Alt+Tab键切换当前应用程序时,图面将会丢失,因此在重新回到DirectDraw应用程序中时,必需用Restore方法恢复图面。遗憾的是,虽然图面被恢复了,但其中图形数据却丢失了,需要重新绘制。

2.3.2 dx2运行过程

启动dx2程序后,只有第一个“执行”按钮可以使用,按下该按钮后,系统将创建DirectDraw对象,并设置为800*600全屏幕显示方式;按顺序按下“创建主图面”、“创建

图2.2 dx2 装入并显示图形文件程序运行界面

后台图面”按钮,分别创建对应屏幕显示的主图面和100*100点阵的后台图面;按下“后台图面装入图形”按钮,则图形文件view.bmp被一100*100点阵装入到后台图面,屏幕上看不见图形;再按下“主图面装入图形”按钮,view.bmp以200*100点阵缩放后装入到主图面(屏幕)的(0,0)位置,此时图形显示在屏幕左上角;继续按“拷贝后台图面到主图面”,将把后台图面的100*100图形显示在屏幕的(200,0)位置,我们可以看到两副同样的图形以不同的缩放比例并排显示在屏幕左上方;按下“图面丢失”后,屏幕被设置成640*480的显示方式,屏幕上显示出的图形消失了;用“恢复丢失的图面”按钮重新设置显示方式为800*600(必需恢复显示方式,否则图面恢复将会失败)并恢复图面,此时,失去的图形在屏幕上仍然看不见;最后,按“重新显示图形”来重新绘制view.bmp,屏幕重新展现原有的图形。



2.3.3 dx2程序的编程实现

2.2.2 dx1编程实现

启动C++ Builder后在窗口Form1中设计如图2.2的操作界面,各对象相关属性设置如表2.3:

控件对象类型
控件对象名称
相关属性
属性值

TForm
Form1
Caption
DirectX 练习程序1

TLabel
Label1
Caption
运行状态:

TLabel
Label2
Caption
设备的枚举

Tlabel
Label3
Caption
显示模式DDraw2

TEdit
Edit1
Text
(空)

ReadOnly
True

TGroupBox
GroupBox1
Caption
状态

TCheckBox
CheckBox6
Caption
DDSCL_NOWINDOWCHANGES

Checked
true

TButton
Button1
Caption
执行

TButton
Button2
Caption
创建主图面

Enabled
False

TButton
Button3
Caption

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接