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