GDI图形编程(4)

 

3.2.4  画笔与画刷

所有的图形操作都需要一个Pen对象(主要用于绘制线段)或者Brush对象(用于使用纯色来填充窗体中的某个区域),这些对象应当在代码中进行创建,并且在使用完后进行释放。

1. 画笔

要创建一个画笔,只需要实例化一个新的System.Drawing.Pen对象,然后指定画笔的颜色即可(我们已经在第3.2.3节中讨论过)。

除了指定画笔颜色外,还可以指定它的宽度(单位为像素)。在默认情况下,画笔的宽度为一个像素。

画笔创建完成以后,还可以通过其Color或Width属性来进行修改,不需要再新建一个新的Pen对象。

画笔还可以绘制虚线,这是通过其DashStyle属性来控制的。

在使用完一个Pen对象后,记得要调用Dispose方法将分配给它的资源释放掉。

2. 画刷

System.Drawing.Brush类与Pen类有所不同,它实际上是一个抽象基类。.NET Framework通过该基类提供了几种不同类型的画刷,在实际使用时,必须对这些派生的类型进行实例化。

在.NET CF中有两个这样的画刷类:SolidBrush与TextureBrush。最常用的是SolidBrush;通过向其构造函数中传递一个Color参数,它就会创建一个纯色用于填充我们所绘制的区域的内部。TextureBrush的构造函数中要传递的不是Color参数,而是一个Bitmap对象,它将以该位图图像的平铺副本来填充图形内部(我们很快就会讨论Bitmap对象)。

这两个画刷类都提供了用于对其外观进行修改的属性(SolidBrush类中是Color属性,TextureBrush类中是Image属性)。同样,在使用完画刷对象后应调用Dispose函数来释放它们所占用的资源。

但是,.NET CF中所包含的画刷派生类比桌面版.NET Framework中提供的要少。如果您对桌面版GDI的使用方法很熟悉,就会注意到.NET CF中没有提供LinearGradientBrush类,这令人遗憾,因为它可以创建一些有用且很吸引人的填充区域。我们只好自己编写代码来模拟该类的效果了。

3.2.5  绘制线段

在窗体中可以呈现的所有图形中,线段是最简单的图形结构。一条线段应该包含下面几个属性:

● 用于画线段的Pen类

● 线段的起点坐标

● 线段的终点坐标

在绘制线段时,这些属性都会以参数的方式传递给Graphics对象的DrawLine方法,如程序清单3-2所示,这段代码发生在窗体的Paint事件中。

程序清单3-2  使用DrawLine方法

private void MyForm_Paint(object sender, PaintEventArgs e)

{

// Draw a line from point (10, 10) to point (40, 40)

using (Pen linePen = new Pen(Color.Black))

{

e.Graphics.DrawLine(linePen, 10, 10, 40, 40);

}

}

这段代码在坐标(10,10)到坐标(40,40)之间绘制了一条黑色的线段,如图3-3所示。注意,线段包含了这两个端点;线段实际的高度和宽度都为31像素。这看上去似乎是个微不足道的小细节,但如果要绘制很多需要链接在一起的线段,这个细节就会变得重要了。

DrawLines是DrawLine方法的一个延伸,可以一次性绘制一系列首尾链接的线段。您需要提供一个Point变量数组,DrawLines会依次在各相邻点之间绘制一条连接在一起的线段。该方法不会将最后一个点与第一个点连接起来。所以,如果您想要绘制一个闭合的环,就需要在数组的最后再次指定第一个点的坐标,或者使用下一节将要介绍的DrawPolygon方法。程序清单3-3演示了如何绘制折线,结果如图3-4所示。

程序清单3-3  使用DrawLines方法

private void MyForm_Paint(object sender, PaintEventArgs e)

{

// Declare an array of points

Point[] points = { new Point(20, 20), new Point(50, 50),

new Point(80, 20), new Point(110, 50),

new Point(140, 20) , new Point(170, 50) };

using (Pen linePen = new Pen(Color.Black))

{

// Draw a series of lines between each defined point

e.Graphics.DrawLines(linePen, points);

}

}

读书导航