在CB中进行DirectX编程(3)

2016-02-19 16:33 2 1 收藏

生活已是百般艰难,为何不努力一点。下面图老师就给大家分享在CB中进行DirectX编程(3),希望可以让热爱学习的朋友们体会到设计的小小的乐趣。

【 tulaoshi.com - 编程语言 】

  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程序的编程实现

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

  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   创建后台图面

  Enabled   False

  TButton    Button4    Caption   后台图面装入图形

  Enabled   False

  TButton    Button5    Caption   主图面装入图形

  Enabled   False

  TButton    Button6    Caption   拷贝后台图面到主图面

  Enabled   False

  TButton    Button7    Caption   图面丢失:设置640*480方式

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

  Enabled   False

  TButton    Button8    Caption   恢复已丢失的图面

  Enabled   False

  TButton    Button9    Caption   重新显示图形

  Enabled   False

  表2.3 dx2控件对象属性设置一览表

  2.3.3.1 创建主图面

  用HRESULT IDirectDraw::CreateSurface来创建图面:

  lpDD2-CreateSurface(LPDDSURFACEDESC lpDDSurfaceDesc,

  LPDIRECTDRAWSURFACE FAR *lpDDSurface,

  Iunknown FAR *pUnkOuter)

  (1)参数lpDDSurfaceDesc是一个志向DDSURFACEDESC结构的指针,DDSURFACEDESC结构的定义比较复杂,幸好一般只需要使用其中很少的一部分。结构DDSURFACEDESC的部分描述如表2.4所示:

  结构成员

  描述

  DOWRD dwSize

  DDSURFACE结构的尺寸。在使用此结构之前,此项数据必需用sizeof函数设置

  DWORD dwFlags

  控制标志。主要可以设置的标志为:

  DDSD_CAPS、

  DDSD_HEIGHT、

  DDSD_WIDTH、

  DDSD_BACKBUFFERCOUNT、

  DDSD_PIXELFORMATDENG 等

  DWORD dwHeight

  图面高度。主图面不需要设置

  DWORD dwWidth

  图面宽度。主图面不需要设置

  DDSCAPS ddsCaps

  图面能力。DDSCAPS也是一个结构,在创建图面时需要设置其成员dwCaps的值,以便确定所建图面的性质。

  DwCaps的取值主要有:

  DDSCAPS_PRIMARYSURFACE:主图面

  DDSCAPS_OFFSCREENPLAIN:后台图面

  DDSCAPS_COMPLEX:复合图面

  DDSCAPS_FLIP:图面翻转链

  DDSCAPS_OVERLAY:覆盖图面

  DDSCAPS_VIDEOMEMORY:图面创建在显示内存

  DDSCAPS_LOCALVIDMEM:使用常规显示内存

  DDSCAPS_NONLOCALVIDMEM:使用AGP内存

  DDSCAPS_SYSTEMMEMORY:图面创建在系统内存

  表2.4 DDSURFACEDESC结构的部分成员说明

  (2)参数lpDDSurface返回一个指向所创建图面的指针。

  (3)参数pUnkOuter未使用,必需为NULL。

  创建主图面需要以下步骤:

  (1)获得并设置DDSURFACEDESC结构的尺寸dwSize:ddsd.dwSize=sizeof(ddsd);

  (2)简单地设置ddsd.dwFlags=DDSD_CAPS;

  (3)设置主图面标志:ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE;

  (4)调用CreateSurface方法创建图面。

  2.3.3.2 创建后台图面

  后台图面的创建与创建主图面基本相同,只是在DDDURFACEDESC结构中多给出一些信息。创建后台图面需要以下步骤:

  (1) 获得并设置DDSURFACEDESC结构的尺寸dwSize:ddsd.dwSize=sizeof(ddsd);

  (2) 设置ddsd.dwFlags=DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH;

  (3) 设置后台表面的宽和高(dx2中设为100):ddsd.dwHeight=100; ddsd.dwWidth=100;

来源:https://www.tulaoshi.com/n/20160219/1612393.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 选择升序排序或降序排序命令如果用户需要对收件人进行更高级的排序,则可以在筛...

经验教程

56

收藏

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