仅仅知道如何创建DirectDraw编程需要使用到的一些对象是远远不够的,还需要使用灵活的使用这些对象提供的方法,下面按照DirectDraw处理图像的步骤来说明这些方法的使用。
1、建立协作层
当建立了一个DirectDraw对象之后,首先要设定DirectDraw的协作层。实现的方法是调用DirectDraw对象的SetCooperativeLevel函数。该函数的定义是:
SetCooperativeLevel( hdl As Long, flags As CONST_DDSCLFLAGS)
其中参数hdl指定程序的窗口句柄,参数flag决定程序运行的方式,它的值可以使用Or组合起来。具体值的含义如下:DDSCL_FULLSCREEN表示使用全屏幕(必须和DDSCL_EXCLUSIVE一起用)、DDSCL_ALLOWMODEX使用Modex模式、DDSCL_EXCLUSIVE 使用独占模式、DSCL_NORMAL 使用Windows的窗口、DDSCL_NOWINDOWCHANGES 禁止改变窗体大小。例如函数调用SetCooperativeLevel Me.hWnd, DDSCL_NORMAL将使程序运行于普通的协作层既窗口模式之下,在这种协作层你无法改变主表面调色板或进行页交换。而函数调用SetCooperativeLevel MainForm.hWnd, DDSCL_EXCLUSIVE Or _DDSCL_FULLSCREEN将使程序运行于全屏幕模式之下。在全屏幕协作模式之下你可以完全使用硬件的一切,你可以设置自己的调色板,改变显示分辨率及进行页交换。
2、设置显示模式
设置系统的显示模式是使用DirectDraw的SetDispalyMode函数实现的,函数的定义如下:
SetDisplayMode( w As Long, h As Long, bpp As Long, ref As Long, mode As CONST_DDSDMFLAGS)
其中参数w、h分别指定屏幕的宽度和高度,bpp指定屏幕显示的颜色位数,参数ref指定屏幕的刷新频率,设置为0使用显示驱动的缺省刷新频率,mode指定附加的参数。为了保证程序的健壮性,需要获得系统支持的显示模式,此时可以使用DirectDraw对象的GetDisplayModesEnum函数来遍历所有支持的显示模式,然后根据返回的结果进行设置。
3、建立DirectDrawSurface表面对象显示图像
DirectDrawSurface对象是DirectDraw用来进行图像显示和绘制的对象,开发人员不仅可以在DirectDrawSurface上贴位图、绘制图形,还可以直接操作DirectDrawSurface对象来处理显存或内存里的图像数据。一般来说它分成以下几种类型:primarysruf surface(主表面), 屏幕上可以看到的显示记忆体,图像画在上面就能显示在屏幕上;backsurf surface (后备表面),这是一个能跟primarysruf surface作快速切换的表面;offscreen surface (离屏表面),这是一个屏幕上看不见的Surface,主要用来存放图像数据。
利用DirectDraw对象的CreateSurface方法可以建立一个DirectDrawSurface7对象,设置DDSURFACEDESC2结构对象的不同标志可以实现不同的表面对象。为了改善图像显示效果,在DirectDraw编程时,一般设立一个主表面、后备表面和若干个离屏表面,主表面就是用户看到的显示图像的表面,也就是当前显示的表面,后备表面是主表面的附带缓冲表面,用来存储、处理即将显示的图像,离屏表面用来装载最初的图像数据,可以利用DirectDraw对象的CreateSurfaceFromFile函数或者CreateSurfaceFromResource函数建立一个DirectDrawSurface7对象,同时将图象文件或者资源文件中的图像装入建立的 DirectDrawSurface中,该函数调用成功后返回一个DirectDrawSurface对象。
处理后使用Blt函数将数据拷贝到后备表面,此时DirectDraw使用filp方法交换主表面和后备表面,后备表面变为主表面显示图像,先前的主表面变为后备表面,这样作既提高的图像数据的处理速度,又有效的避免图像闪烁,笔者认为这是DirectDraw编程中最重要的思想。
上面给出了DirectDraw的主要编程步骤,为了使读者更清楚的了解一些编程细节,下面给出了一个具体的实现代码,该程序在Windows98、Visual Basic 6.0编译环境下编译通过,运行正常,它实现了全屏幕显示一个图像,同时在图像的左上方叠加了一行文字说明。读者可以在此基础上实现动画效果,比如让说明文字在背景图像上动态显示等。
//////////////////////////////////////
Option Explicitf '声名全局变量;
Dim dx As New DirectX7 'DirectX对象;
Dim dd As DirectDraw7 'DirectDraw对象;
Dim picturesurf As DirectDrawSurface7 '离屏表面对象;
Dim primarysruf As DirectDrawSurface7 '主表面对象;
Dim backsurf As DirectDrawSurface7 '后备表面对象;
Dim ddsd1 As DDSURFACEDESC2 'DDSURFACEDSC2对象;
Dim ddsd2 As DDSURFACEDESC2
Dim ddsd3 As DDSURFACEDESC2
Dim brunning As Boolean
Dim binit As Boolean
/////////////////////////////////////////////
Private Sub Form_Load()
On Local Error GoTo errOut
Set dd = dx.DirectDrawCreate("") '生成DirectDraw对象;
Me.Show
'设置协作模式
Call dd.SetCooperativeLevel(Me.hWnd, DDSCL_FULLSCREEN Or DDSCL_ALLOWMODEX Or DDSCL_EXCLUSIVE)
'设置"1024*768*24"的显示模式
dd.SetDisplayMode 1024, 768, 24, 0, DDSDM_DEFAULT
'设置主绘图平面的属性
ddsd1.lFlags = DDSD_CAPS Or DDSD_BACKSURFCOUNT
ddsd1.ddsCaps.lCaps = DDSCAPS_PRIMARYSRUFSURFACE Or DDSCAPS_FLIP Or DDSCAPS_COMPLEX
ddsd1.lBacksurfCount = 1
'创建主表面和后备表面;
Set primarysruf = dd.CreateSurface(ddsd1)
Dim caps As DDSURFACEDESC2
'设置缓冲绘图平面的属性
caps.lCaps = DDSCAPS_BACKSURF
Set backsurf = primarysruf.GetAttachedSurface(caps)
backsurf.GetSurfaceDesc ddsd3 '获取后备表面的尺寸;
backsurf.SetForeColor vbBlue '设置后备表面中的字体颜色为蓝色;
backsurf.SetFontTransparency True '设置后备表面的字体为透明效果;
Set picturesurf = Nothing
ddsd2.lFlags = DDSD_CAPS Or DDSD_HEIGHT Or DDSD_WIDTH
ddsd2.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关文章
热点关注
- 在asp.net中为Web用户控件
- .NET3.5和VS2008中的ASP.N
- 对.NET Framework 反射的
- Asp.net Ajax 1.0 异步回
- ASP.NET2.0的控件状态和视
- 通过避免下列10个常见ASP.
- 中国地区三级联动下拉菜单
- 解析Asp.net中资源本地化
- 一个无刷新效果定时自动更
- 动态创建MSSQL数据库表存
- asp.net用url重写URLReWri
- 使用ASP.NET Atlas编写显
- 关于ASP.NET调用JavaScrip
- 使用ASP.Net Forms模式实
- asp.net ajax 使用updatep
- 优化ASP.NET应用程序性能
- ASP.NET中动态修改web.con
- ASP.NET中利用Crystal Rep
- asp.net如何生成图片验证
- 基于ASP.NET的Web动态控件
- 分享个极好的无刷新二级联
- asp.net 2.0 上传控件的使
- 创建ASP.NET监视服务器进
- Asp.net把UTF-8编码转换为
- 开发基于ASP.NET WebServi
- asp.net结合html,javascr
- asp.net 2.0下嵌套masterp
- 正则表达式提取数字
- 最新版FreeTextBox(版本3.
- 获取本机上配置好的Oracle
- ASP.Net全局变量的设置和
- VB几个有用的函数
- 用代码画折线图/柱形图/
- FCKeditor2.2 ASP.NET2.0
- 客户端回调实现gridView无
IDC资讯
虚拟主机
域名注册
托管租用
vps主机
智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD




