扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:刘 涛 来源:yesky 2007年10月15日
关键字:
////////////////////////////////////// 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 ddsd2.lWidth = ddsd3.lWidth ddsd2.lHeight = ddsd3.lHeight Set picturesurf = dd.CreateSurfaceFromFile("c:\Waterskier.bmp", ddsd2) '离屏表面以全屏幕的尺寸来装载图像; binit = True brunning = True Do While brunning blt DoEvents Loop errOut: '显示出现错误的情况下恢复系统的正常显示模式; Call dd.RestoreDisplayMode Call dd.SetCooperativeLevel(Me.hWnd, DDSCL_NORMAL) End End Sub ////////////////////////////////////////// Private Sub Form_Paint() '窗口重画函数; blt End Sub /////////////////////////////////////////////////////// Sub blt() '"画图"函数; On Local Error GoTo errOut If binit = False Then Exit Sub Dim rPicture As RECT, rback As RECT rPicture.Bottom = ddsd2.lHeight rPicture.Right = ddsd2.lWidth rback.Bottom = ddsd3.lHeight rback.Right = ddsd3.lWidth Call backsurf.BltFast(0, 0, picturesurf, rPicture, DDBLTFAST_WAIT) '在表面上书写文字; Call backsurf.DrawText(20, 20, "DirectDarw 编程示范", False) Call backsurf.DrawText(20, 40, "单击鼠标后退出!", False) primarysruf.Flip Nothing, DDFLIP_WAIT errOut: Call dd.RestoreDisplayMode Call dd.SetCooperativeLevel(Me.hWnd, DDSCL_NORMAL) End Sub ///////////////////////////////////////////// Private Sub Form_Click() '单击鼠标后程序结束程序运行; Call dd.RestoreDisplayMode Call dd.SetCooperativeLevel(Me.hWnd, DDSCL_NORMAL) End End Sub |
上面的程序虽然比较简单,但是它包含了DirectDraw的基本应用。首先通过DirectX7的DirectDrawCreate方法建立一个DirectDraw对象,然后通过调用DirectDraw对象的SetCooperativeLevel 方法将程序设置为独占、全屏的模式,SetDisplayMode方法设置系统的显示模式。
接下来是设置绘图平面,DDSURFACEDESC2结构的dwFlags成员用来决定DDSURFACEDESC2结构中哪些成员将被填充有效的信息,例如程序中在创建主表面时,将DDSURFACEDESC2结构的lFlags设为想要用DDSCAPS结构(DDSD_CAPS)和想创建后备表面(back buffer)(DDSD_BACKBUFFERCOUNT),ddCaps成员在例子中标示一个将要在DDSCAPS结构中使用的标志位,程序中指定了一个主表面(DDSCAPS_PRIMARYSURFACE)、一个交换页(DDSCAPS_FLIP)、一个合成表面(DDSCAPS_COMPLEX);DDSURFACEDESC2结构中lBacksurfCount成员为"1"说明当前要在主表面下建立一个后备表面。
创建主表面后,程序通过调用主表面的GetAttachedSurface方法获取了后备表面。获取了表面对象后,调用表面对象的SetForeColor、 DrawText等方法就可以在相应的表面上添加特定效果的文本了。至于程序中绘制图像我就不多解释了,读者可以仔细阅读上面的代码,其实说白了,DirectDraw显示图像时无非就是在不同表面之间Blt图像数据罢了。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者