9 绘图及图像-谢新冲

  • 格式:doc
  • 大小:746.50 KB
  • 文档页数:39

第9章绘图及图像在窗体和控件上绘图是一种常见的操作,事实上,所有的窗体和控件都是绘制出来的的,如果要实现特定的控件,也需要绘图。

本章介绍有关绘图、字体及图像的基本类及常见的操作。

9.1 绘图基础支持类System.Drawing名字空间包括了.NET的基本图形功能,这种图形功能被称为GDI+。

这个名称来源于原始的Windows图形库,即图形设备接口(Graphical Device Interface,GDI)。

GDI+是在GDI的基础上的2D图形库,是为绘制线条、形状、文本和显示位图而设计的。

System.Drawing名字空间包括了有关绘图的基本功能,更加高级的功能由以下名字空间提供:1)System.Drawing.Drawing2D:供了高级的2D和向量图形。

2)System.Drawing.Imaging:提供了高级的图像处理。

3)System.Drawing.Text:供了高级文本显示功能。

4)System.Drawing.Printing:供了打印功能。

要进行绘图,需要用到相关的基础支持类及数据结构,包括位置、大小、颜色、画笔、和刷子等。

本节就来介绍这些类及数据结构。

9.1.1 位置及大小表示位置及范围,经常要用到点(Point)、矩形(Rectangle)、大小(Size)等数据结构。

1.Point和PointFPoint和PointF都是一种结构,两者都表示一个简单的(X,Y)坐标点。

两者的不同之处在于:Point使用整数坐标,而PointF使用的是浮点(float)型坐标。

表9-1、表9-2和表9-3总结了Point类和PointF类的主要成员。

表9-1 Point结构的成员表9-2 Point结构的static方法表9-3 PointF结构的成员另外,还定义了在和Point之间进行转换的运算符。

2.Rectangle和RectangleFRectangle和RectangleF结构相似,它们都是表示矩形的数值类型,不同之处在于:Rectangle使用整数坐标,而RectangleF则使用浮点型坐标。

表9-4、表9-5和表9-6总结了Rectangle类和RectangleF类的主要成员。

表9-4 Rectangle结构的主要成员表9-5 Rectangle结构的static方法表9-6 RectangleF结构的成员有两个static方法:Truncate()和Union()。

3.Size和SizeFSize和SizeF结构通过Width和Height一对属性表示了一个矩形区域的大小。

如以前,Size使用整数坐标,而SizeF则使用浮点型坐标。

表9-7、表9-8和表9-9总结了Size类和SizeF类的主要成员。

表9-7 Size结构的主要成员表9-8 Size结构的static方法表9-9 SizeF结构的成员另外,系统还提供了从Size到SizeF、从SizeF到Size、从Size到Point以及从SizeF 到PointF的转换。

9.1.3 颜色颜色用Color结构来表示。

颜色值是通过4个整数值表示的:A1pha、Red、Green和B1ue,其中Alpha表示透明度,另外的3个则表示颜色的红、绿、蓝3种基色。

.NET提供了大量的标准颜色,这些颜色被定义为System.Drawing.KnownColor枚举的一部分。

这个枚举包括了一百多个以上的成员,成员的值可以区分为以下两个部分:(1)颜色描绘了屏幕上的元件,如:窗口文本、控件、活动标题。

如果用户使用控制面版改变桌面颜色样式,那么这些都会发生改变。

(2)固定的RGB(红、绿、蓝)值表示了标准的颜色,如:天蓝色(Azure)、菊色(Cornflower)、轻灰色(LightGray)和中紫色(MediumPurple)。

表9-10和表9-11列出了Color类的重要属性和方法。

表9-10 Color类的属性表9-11 Color类的方法如:Color c2 = Color.FromArgb(255, 0, 127);Color c3 = Color.FromArgb(255, 255, 0, 127);Alpha的取值为0表示完全透明,取值为255则表示完全不透明。

例9-1 ColorTest.cs 测试颜色的使用1 private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)2 {3 Graphics g = e.Graphics;4 Color [] colors =5 {6 Color.Red,7 Color.FromName( "Blue" ),8 Color.FromKnownColor( KnownColor.ActiveCaption ),9 Color.FromKnownColor( KnownColor.InactiveCaption ),10 Color.FromArgb( 255, 255, 0 ),11 Color.FromArgb( 128, 255, 255, 0 ),12 };13 for( int i=0; i<colors.Length; i++ )14 {15 g.FillRectangle( new SolidBrush( colors[i]), i*30+10, 20, 20, 100 );16 }17 }运行结果如图9-1:图9-1 测试颜色的使用9.1.4 画笔画笔(Pen)类和刷子(Brush)类包装了线条厚度、线条样式、填充模式和颜色,画笔用来绘制形状、线条和曲线的轮廓,而刷子则用于填充区域。

画笔有两个基本的属性:宽度(Width)和填充颜色(或填充模式)。

填充模式是由Brush的子类来提供的,所以,可以根据需要,在绘制线条的时候,填充合适的纹理(texture)或斜度(gradient)。

表9-12列出了Pen类中的几个重要属性。

表9-12 Pen类的重要属性Alignment描述了画笔是如何与相关线条相对齐的,用PenAlignment枚举的成员表示这些对齐方式,如表9-13所示。

表9-13 PenAlignment枚举DashStyle设置了使用该画笔所绘制虚线(dashed line)的样式,用DashStyle枚举的成员表示这些样式,如表9-14所示。

表9-14 DashStyle枚举线罩(Line cap)主要包括了以下几种:圆、正方形、三角形和自定义形。

PenType类是System.Drawing.Drawing2D.PenType枚举的成员,可能的取值如表9-15所示:表9-15 PenType枚举表9-16中列出了表9-16 Pen类的方法Dispose()方法能释放Pen对象使用的潜在系统资源。

尽管在Pen对象被放入回收站或者程序结束时也会释放这些资源,但是为了有效利用系统资源,在结束Pen对象时应该即时调用Dispose()。

如果想获取一个Pen对象来表示一种标准颜色,可以使用System.Drawing.Pens类。

对于Color类中每一种预定义的颜色,System.Drawing.Pens类都包含相应的Pen对象,如:Pen pen = Pens.AliceBlue;如果想用一个Pen对象描述一种用于UI元件中的默认颜色,就可以使用System.Drawing.SystemPens类。

对于每一种预先定义的UI颜色,这个类都有相应的Pen对象,如:Pen = SystemPens.HighlightText;表9-17列出了所有能够通过SystemPens类的属性检索到的颜色。

表9-17 SystemPens类的属性DashPattern属性通过为每一个破折线和空格的大小提供一个数组,使得可以自定线条的样式:pen. DashPattern = new float[]{ 0.5, 1, 1,5, 2, 2.5 };例9-2 PenTest.cs 使用Pen1 private void Form1_Paint(object sender,System.Windows.Forms.PaintEventArgs e)2 {3 Graphics g = e.Graphics;45 Pen pen;6 Point point = new Point( 10, 10 );7 Size sizeLine = new Size( 0, 150 );8 Size sizeOff = new Size( 30, 0 );910 pen = Pens.LimeGreen;11 g.DrawLine( pen, point+=sizeOff, point+sizeLine );12 pen = SystemPens.MenuText;13 g.DrawLine( pen, point+=sizeOff, point+sizeLine );14 pen = new Pen( Color.Red );15 g.DrawLine( pen, point+=sizeOff, point+sizeLine );16 pen = new Pen( Color.Red, 8 );17 g.DrawLine( pen, point+=sizeOff, point+sizeLine );1819 pen.DashStyle = DashStyle.Dash;20 g.DrawLine( pen, point+=sizeOff, point+sizeLine );21 pen.DashStyle = DashStyle.Dot;22 g.DrawLine( pen, point+=sizeOff, point+sizeLine );2324 pen.DashStyle = DashStyle.Solid;25 pen.StartCap =LineCap.Round;26 g.DrawLine( pen, point+=sizeOff, point+sizeLine );27 pen.EndCap = LineCap.Triangle;28 g.DrawLine( pen, point+=sizeOff, point+sizeLine );2930 pen. DashPattern = new float[]{ 0.5f, 1f, 1,5f, 2f, 2.5f };31 g.DrawLine( pen, point+=sizeOff, point+sizeLine );32 }运行结果如图9-2:图9-2 使用Pen9.1.4 刷子刷子用来填充图形的内部。