×

DirectX与VB.NET编程(十)DirectDraw初体验

Kalet Kalet 发表于2009-03-20 12:00:14 浏览231 评论0

抢沙发发表评论

好久没写文章了,上次是承诺写DirectInput的,但是由于某些原因,无法达成,现在改成了DirectDraw,在以后的一段时间内,我会持续更新Managed DirectDraw 9 for VB.NET的教程,废话不多说,下面开始教程。


===============华丽的分割线===============


首先简介DirectDraw,DirectDraw是DirectX中专门用于2D绘图的组件,DirectDraw在以前一直是DirectX中的最重点,但是到了如今3D横行的年代,DirectDraw已经不再显得那么重要了,即使是现在的2D游戏也是使用Direct3D进行2D绘图,DirectDraw已经逐渐被抛弃了,在DirectDraw 7之后,微软逐渐停止了对DirectDraw的更新,到如今,DirectDraw已经被Direct3D并入了,被称为DirectGraphic,在所有DirectDraw的方法属性注释中,微软都加入了劝解语言,建议让开发者选择Direct3D进行2D开发,即使如此,学习DirectDraw依旧是学习DirectX不可或缺的一部分,对了解DirectX的构造方法也会有一个比较好的了解。

DirectX与VB.NET编程(十)DirectDraw初体验

===============华丽的分割线===============


学习内容
·掌握DirectDraw的基本概念
·使用DirectDraw绘制最基本的元素,如矩形和文字


===============华丽的分割线===============


下面开始DirectDraw的第一个范例,这个范例就是使用DirectDraw绘制一个矩形和文字。
打开VB.NET,新建一个项目,添加引用Microsoft.DirectX.DirectDraw.dll与Microsoft.DirectX.dll,在窗口中添加一个按钮(Button),控件设计请参照下图:



在类头输入如下代码开导入名称空间:
Imports Microsoft.DirectX
Imports Microsoft.DirectX.DirectDraw


===============华丽的分割线===============


同DirectSound一样,DirectDraw也需要声明一个设备以便使用,声明语句如下
Dim vDev As New Device(CreateFlags.Default)
在声明设备后,便设置设备的协作级别,语句如下:
vDev.SetCooperativeLevel(Me, CooperativeLevelFlags.Normal)
其中第一个参数是绘制承载控件,在这里我们使用窗口为承载控件,第二个是协作类型,在此选择为Normal。


===============华丽的分割线===============


DirectDraw所有的绘图都必须绘制在一个平面上,我们称这个平面为表面(Surface),这就相当于一张画布一样,有了这张画布,我们便可以在上面绘制图片、文字和各种图形,声明表面对象的语句如下:
Dim vSurfaceCaps As New SurfaceCaps    '声明一个新的表面属性
vSurfaceCaps.VideoMemory = True     ‘定义表面存放位置为显存,SystemMemory则为内存。
vSurfaceCaps.PrimarySurface = True    '定义表面为主表面,在以后会讲到主表面主要用于显示图形


Dim vSurfaceDes As New SurfaceDescription(vSurfaceCaps)     '用表面属性初始化表面描述


vSurface = New Surface(vSurfaceDes, vDev)     '用表面描述初始化表面,因此该表面则具有以上所定义的属性


===============华丽的分割线===============


下面开始绘图了,双击Button在Click事件中添加如下语句:
vSurface.DrawBox(0, 0, 100, 100)
vSurface.DrawText(0, 0, "HelloWorld", True)

这两句话相信应该很好理解,第一句用于绘制矩形,四个参数分别是左上角坐标和右下角坐标,第二句则是绘制文字,前两个参数是绘制的坐标点,第三个参数是绘制的文本,第四个则是决定是否紧接着上次的文本输出(不过我发现好像没什么效果……)。


===============华丽的分割线===============


运行后会发现输出图像的位置是以屏幕为坐标,坐标(0,0)的输出位置是屏幕的左上角而不是窗口的左上角,虽然设置了承载控件,但是需要注意的是DirectDraw的绘制范围并非局限在承载空间内,你可以在坐标中加入窗口的Left和Top属性来针对指定窗口,至于如何处理标题栏,可以使用GetSystemMetrics这个API。


运行效果如下图:



===============华丽的分割线===============


下面是该范例的全部代码:
Imports Microsoft.DirectX
Imports Microsoft.DirectX.DirectDraw


Imports System.Threading


Public Class Form1
    Inherits System.Windows.Forms.Form


    Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Integer) As Integer
    Const SM_CYCAPTION = 4


    Dim vDev As New Device(CreateFlags.Default)
    Dim vSurface As Surface


#Region " Windows 窗体设计器生成的代码 "


    Public Sub New()
        MyBase.New()


        '该调用是 Windows 窗体设计器所必需的。
        InitializeComponent()


        '在 InitializeComponent() 调用之后添加任何初始化


    End Sub


    '窗体重写 dispose 以清理组件列表。DirectX与VB.NET编程(十)DirectDraw初体验
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub


    'Windows 窗体设计器所必需的
    Private components As System.ComponentModel.IContainer


    '注意: 以下过程是 Windows 窗体设计器所必需的
    '可以使用 Windows 窗体设计器修改此过程。
    '不要使用代码编辑器修改它。
    Friend WithEvents Button1 As System.Windows.Forms.Button
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.Button1 = New System.Windows.Forms.Button
        Me.SuspendLayout()
        '
        'Button1
        '
        Me.Button1.Location = New System.Drawing.Point(56, 112)
        Me.Button1.Name = "Button1"
        Me.Button1.Size = New System.Drawing.Size(120, 24)
        Me.Button1.TabIndex = 1
        Me.Button1.Text = "绘制"
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
        Me.ClientSize = New System.Drawing.Size(232, 146)
        Me.Controls.Add(Me.Button1)
        Me.Name = "Form1"
        Me.Text = "DirectDraw"
        Me.ResumeLayout(False)


    End Sub


#End Region


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        vDev.SetCooperativeLevel(Me, CooperativeLevelFlags.Normal)
        Dim vSurfaceCaps As New SurfaceCaps
        vSurfaceCaps.VideoMemory = True
        vSurfaceCaps.PrimarySurface = True
        vSurfaceCaps.StandardVgaMode = False


        Dim vSurfaceDes As New SurfaceDescription(vSurfaceCaps)


        vSurface = New Surface(vSurfaceDes, vDev)
    End Sub


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        vSurface.DrawBox(Me.Left, Me.Top + GetSystemMetrics(SM_CYCAPTION), Me.Left + 100, Me.Top + GetSystemMetrics(SM_CYCAPTION) + 100)
        vSurface.DrawText(Me.Left, Me.Top + GetSystemMetrics(SM_CYCAPTION), "HelloWorld", False)
    End Sub
End Class


===============华丽的分割线===============

DirectX与VB.NET编程(十)DirectDraw初体验

相信你应该了解如何简单初步地使用DirectDraw了,下次的是全屏下图形绘制和如何改变字体和颜色。



群贤毕至

访客