×

VB.Net游戏编程入门经典(2)

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

抢沙发发表评论

1.2  使用Graphics对象执行图形操作


使用GDI+的第一步总是先创建一个Graphics对象,它有助于图形操作的执行。Graphics类提供了在特定的设备上下文中进行画图的方法。


有四种方法可以获得适当的Graphics对象:从使用Paint事件接收到的e参数获得、从窗口句柄中获得、从图像中获得,或者从指向设备上下文的特定句柄中获得。这些不同的方法实际上没有本质的区别,我们可以根据程序需要使用其中任何一种方法。例如,如果在窗体的Paint事件中编写画图函数的话,则可以使用e参数获得Graphics对象。但是,如果希望编写一个类实现在窗体上画图的话,则可能需要使用窗口句柄来创建Graphics对象。在接下来的章节中,我们将讨论每一种获得Graphics对象的方法。

VB.Net游戏编程入门经典(2)

1.2.1  使用PaintEventArgs参数创建Graphics对象


这种情况下,所有关于画图的代码必须与目标图像对象的Paint事件相关联。下面的代码展示了如何在屏幕的(10,20)(用像素表示)位置上绘制一个简单的红色长方形,长方形的高是7(像素)、长是13(像素)。


Public Sub PicSourcePaint(ByVal Sender As Object, ByVal E As PaintEventArgs)


E.Graphics.FillRectangle(New SolidBrush(Color.Red), 10, 20, 13, 7)


End Sub


 注意


在代码段的前几行,可以看到.NET如下的事件处理特点:


VB的每个事件处理过程都至少接收到两个参数:发送者对象(它是产生该事件的对象)和一个与该事件有关的对象(即EventArgs对象)。


事件处理过程通过事件与方法关联(通常在InitializeComponent方法中)而与对象相联系。它们的关联是通过+=操作符实现的,如:


AddHandler Me.Paint, AddressOf PicSourcePaint


e参数的类型是Windows.Forms.PaintEventArgs。注意,.NET语言的所有内容都集中在被称作命名空间的托管代码单元中。在这个例子中,我们使用了System.Windows.Forms命名空间,该命名空间包含那些用于创建基于Windows的应用程序的类,这些应用程序使用了Windows操作系统的特征。在这个命名空间里,我们使用了PaintEventArgs类,它主要给出了Paint事件,以访问待更新的长方形数据结构(ClipRectangle属性)和用作更新操作的Graphics对象。


Graphics类和SolidBrush类由System.Drawing命名空间定义。该命名空间还有一些其他类,这些类提供了所有用于二维图形绘制、图像控制和版面设计的函数。在代码示例中,我们使用红色色彩(使用Color数据结构)属性创建了SolidBrush对象,使用该对象绘制了一个长方形,并使用Graphics对象的FillRectangle方法对长方形进行填充。


1.2.2  使用窗口句柄创建Graphics对象


为了在GDI+中创建图形图像,必须使用一个句柄来指向窗口(window)的可拖拽部分。这个句柄就是Graphics对象,它可以通过Graphics.FromHwnd方法(Hwnd意为“Handle from a window”)获得。在示例代码中,Graphics.FromHwnd是System.Drawing.Graphics. FromHwnd方法的快捷方式,该方法在给定句柄下创建一个Graphics对象,该对象用于在特定窗口或特定控件里进行图形绘制。本段代码涉及到一个名为picSource的pictureBox控件。


Dim GameGraphics As Graphics


GameGraphics = Graphics.FromHwnd(PicSource.Handle)


GameGraphics.FillRectangle(New SolidBrush(Color.Red), 10, 20, 13, 7)

VB.Net游戏编程入门经典(2)

1.2.3  从图像中创建Graphics对象


FromImage方法是从一个给定的图像中创建Graphics对象,方法的使用如下所示:


Dim GameGraphics As Graphics


GameGraphics = Graphics.FromImage(PicSource.Image)


GameGraphics.FillRectangle(New SolidBrush(Color.Red), 10, 20, 13, 7)


注意,上述代码只有当一个有效位图图像加载到了pictureBox控件时才可以正常执行。如果试图在一个空的pictureBox控件或者使用索引像素格式的图像(如JEPG图像)加载到picture- Box控件来执行上述代码的话,程序将会出错,将不会创建Graphics对象。


1.2.4  从一个指向设备上下文的特定句柄创建Graphics对象


类似前面提到的方法,在给定了特定设备上下文句柄的情况下,使用Graphics.FromHdc方法可以创建一个允许程序进行拖拽操作的Graphics对象。使用GetHdc方法,可以从另一个Graphics对象获得指向设备的句柄,如以下代码片段所示:


Public Sub FromHdc(E As PaintEventArgs)


' Get Handle To Device Context.


Dim Hdc As IntPtr = E.Graphics.GetHdc()


' Create New Graphics Object Using Handle To Device Context.


Dim NewGraphics As Graphics = Graphics.FromHdc(Hdc)


NewGraphics.FillRectangle(New SolidBrush(Color.Red), 10, 20, 13, 7)


' Release Handle To Device Context.


E.Graphics.ReleaseHdc(Hdc)

VB.Net游戏编程入门经典(2)

End Sub



群贤毕至

访客