1、9 绘图及图像谢新冲第9章 绘图及图像在窗体和控件上绘图是一种常见的操作,事实上,所有的窗体和控件都是绘制出来的的,如果要实现特定的控件,也需要绘图。本章介绍有关绘图、字体及图像的基本类及常见的操作。9.1 绘图基础支持类System.Drawing名字空间包括了.NET的基本图形功能,这种图形功能被称为GDI+。这个名称来源于原始的Windows图形库,即图形设备接口(Graphical Device Interface,GDI)。GDI+是在GDI的基础上的2D图形库,是为绘制线条、形状、文本和显示位图而设计的。System.Drawing名字空间包括了有关绘图的基本功能,更加高级的功能由
2、以下名字空间提供:1) System.Drawing.Drawing2D:供了高级的2D和向量图形。2) System.Drawing.Imaging:提供了高级的图像处理。3) System.Drawing.Text:供了高级文本显示功能。4) System.Drawing.Printing:供了打印功能。要进行绘图,需要用到相关的基础支持类及数据结构,包括位置、大小、颜色、画笔、和刷子等。本节就来介绍这些类及数据结构。9.1.1 位置及大小表示位置及范围,经常要用到点(Point)、矩形(Rectangle)、大小(Size)等数据结构。1Point和PointF Point和PointF
3、都是一种结构,两者都表示一个简单的(X,Y)坐标点。两者的不同之处在于:Point使用整数坐标,而PointF使用的是浮点(float)型坐标。表 91、表 92和表 93总结了Point类和PointF类的主要成员。表 91 Point结构的成员 成 员 描 述 IsEmpty 如果X和Y都是0,则返回True X X坐标 Y Y坐标 Equals 如果两个点的坐标相同,则返回True Offset 通过一个具体的数值平移坐标 ToString 返回一个表示坐标点的字符串 +,- +、-运算符 =,!= 等式运算符 表 92 Point结构的static方法 方 法 描 述 Ceiling
4、将PointF坐标向上近似成最接近的整数Round 将PointF坐标向下近似成最接近的整数Truncate 截取PointF坐标 表 93 PointF结构的成员 成 员 描 述 IsEmpty 如果X和Y都是0,则返回True X X坐标 Y Y坐标 +,- +,-运算符 =,!= 等式运算符 另外,还定义了在Point和Size之间、Point和PointF之间、PointF和Point之间进行转换的运算符。2Rectangle和RectangleFRectangle和RectangleF结构相似,它们都是表示矩形的数值类型,不同之处在于:Rectangle使用整数坐标,而Rectang
5、leF则使用浮点型坐标。表 94、表 95和表 96总结了Rectangle类和RectangleF类的主要成员。表 94 Rectangle结构的主要成员 成 员 描 述 IsEmpty 如果X和Y都是0,则返回True X,Y 左上角的X和Y坐标 Top,Left,Bottom,Right 矩形左上右下的坐标 Width,Height 矩形的宽度和高度 Location 获取(或设定)左上角的坐标 Size 表示矩形高度和宽度的Size对象 Contains 如果矩形中包括了一个给定的矩形(或点),则返回TrueEquals 如果这个点和其他的点包括了相同的坐标,则返回TrueFromLT
6、RB 由左、上、右、下的坐标值创建一个矩形 Inflate 放大矩形 Intersect 返回两个矩形交叉部分的矩形 IntersectsWith 如果一个矩形和另外一个矩形交叉,则返回True Offset 通过一个具体的数值平移一个点的坐标 ToString 返回一个表示矩形的字符串 Union 返回一个表示两个矩形合并的矩形 =,!= 等式运算符 表 95 Rectangle结构的static方法 方 法 描 述 Ceiling 将RectangleF的坐标向上近似成最接近的整数Round 将RectangleF的坐标向下近似成最接近的整数Truncate截取RectangleF的坐标
7、Union 返回一个表示两个矩形合并的矩形 表 96 RectangleF结构的成员 成 员 描 述 IsEmpty 如果X和Y都是0,则返回True X,Y 左上角的X和Y坐标 Top,Left,Bottom,Right 矩形上、左、下、右的坐标 Width,Height 矩形的宽度和高度 Location 获取(或设定)左上角的坐标 Size 表示矩形高度和宽度的Size对象 Contains 如果矩形中包括了一个给定的矩形(或者点),则返回TrueEquals 如果这个点和其他的点包括了相同的坐标,则返回True FromLTRB 由左、上、右、下的坐标值创建一个矩形 Inflate 放
8、大矩形 Intersect 返回两个矩形交叉部分的矩形 IntersectsWith 如果一个矩形和另外一个矩形交叉,则返回True Offset 通过一个具体的数值转换一个点的坐标 ToString 返回一个表示矩形的字符串 =,!= 等式运算符,用来运算矩形的大小的位置 另外,还定义了在Rectangle和RectangleF之间双向转换的运算符。RectangleF有两个static方法:Truncate()和Union()。3Size和SizeF Size和SizeF结构通过Width和Height一对属性表示了一个矩形区域的大小。如以前,Size使用整数坐标,而SizeF则使用浮点型
9、坐标。表 97、表 98和表 99总结了Size类和SizeF类的主要成员。表 97 Size结构的主要成员 成 员 描 述Height 矩形区域的高度Width 矩形区域的宽度IsEmpty 如果高和宽的值都是0,则返回True Equals 测试两个Size对象的高和宽是否相等 ToString 返回一个表示Size的字符串 +,- +,-运算符 =,!= 等式运算 表 98 Size结构的static方法 方 法 描 述 Ceiling 将SizeF的坐标向上近似成最接近的整数 Round 将SizeY的坐标向下近似成最接近的整数 Truncate 截取SizeF的坐标 表 99 Siz
10、eF结构的成员成 员描 述Height 矩形区域的高度 Width 矩形区域的宽度 IsEmpty 如果高和宽的值都是0,则返回True Equals 测试两个Size对象的高和宽是否相等 ToPointF 返回一个表示SizeF的Point对象 ToSize 返回一个表示SizeF的Size对象 ToString 返回一个表示SizeF的字符串 +,- +,-运算符 =,! = 等式运算 另外,系统还提供了从Size到SizeF、从SizeF到Size、从Size到Point以及从SizeF到PointF的转换。9.1.3 颜色颜色用Color结构来表示。颜色值是通过4个整数值表示的:A1p
11、ha、Red、Green和B1ue,其中Alpha表示透明度,另外的3个则表示颜色的红、绿、蓝3种基色。.NET提供了大量的标准颜色,这些颜色被定义为System.Drawing.KnownColor枚举的一部分。这个枚举包括了一百多个以上的成员,成员的值可以区分为以下两个部分:(1) 颜色描绘了屏幕上的元件,如:窗口文本、控件、活动标题。如果用户使用控制面版改变桌面颜色样式,那么这些都会发生改变。(2) 固定的RGB(红、绿、蓝)值表示了标准的颜色,如:天蓝色(Azure)、菊色(Cornflower)、轻灰色(LightGray)和中紫色(MediumPurple)。表 910和表 911
12、列出了Color类的重要属性和方法。表 910 Color类的属性 属 性 描 述 A 获取颜色的alpha(透明度)成分 R,G,B 获取颜色的红、绿、蓝成分 IsEmpty 如果颜色值没有初始化,则返回True IsKnownColor如果颜色符合预定义的颜色,则返回TrueIsNamedColor如果颜色有一个名称,则返回True Name 返回颜色的名称 表 911 Color类的方法 方 法 描 述 Equals 测试Color对象是否相等 FromArgb,FromKnownColor,FromName 创建一个Color对象 GetBrightness,GetHue,GetSat
13、uration获取颜色的色调(Hue)、饱和度(Saturation)、亮度(Brightness)成分,即:HSB成分ToArgb 返回的颜色的Alpha、Red、Green和Blue成分 ToKnownColor 将已知颜色的成员返回给相应的颜色对象 =,!= 测试颜色值是否相等 注意,Color没有构造函数,但是可以通过使用静态的生成方法返回Color对象的引用,如:Color c2 = Color.FromArgb(255, 0, 127);Color c3 = Color.FromArgb(255, 255, 0, 127);Alpha的取值为0表示完全透明,取值为255则表示完全不
14、透明。例 91 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 C
15、olor.FromArgb( 255, 255, 0 ),11 Color.FromArgb( 128, 255, 255, 0 ),12 ;13 for( int i=0; icolors.Length; i+ )14 15 g.FillRectangle( new SolidBrush( colorsi), i*30+10, 20, 20, 100 );16 17 运行结果如图 91:图 91 测试颜色的使用9.1.4 画笔画笔(Pen)类和刷子(Brush)类包装了线条厚度、线条样式、填充模式和颜色,画笔用来绘制形状、线条和曲线的轮廓,而刷子则用于填充区域。画笔有两个基本的属性:宽度(W
16、idth)和填充颜色(或填充模式)。填充模式是由Brush的子类来提供的,所以,可以根据需要,在绘制线条的时候,填充合适的纹理(texture)或斜度(gradient)。表 912列出了Pen类中的几个重要属性。表 912 Pen类的重要属性 属 性 描 述 Alignment 获取(或设置)这只画笔所绘制对象的对齐(参见表11.3) Brush 获取(或设置)与这只画笔相关的刷子 Color 获取(或设置)这只画笔的颜色 DashPattern 获取(或设置)自定义的破折号和空格的排列 DashStyle 表示这条线所使用的破折号样式 LineJoin 表示线条连接的方法 MiterLim
17、it 表示在斜接角上,连接厚度的限度 PenType 说明画笔的类型 StartCap,EndCap表示线条的开始罩(cap)和结束罩 Transform 一个矩阵,用于描述该画笔所绘制对象是如何转换的 Width 获取(或设置)画笔的像素宽度 Alignment描述了画笔是如何与相关线条相对齐的,用PenAlignment枚举的成员表示这些对齐方式,如表 913所示。表 913 PenAlignment枚举 成 员 描 述 Center 画笔和正被绘制线条的中心对齐 Inset 画笔和正被绘制线条的内部对齐 Left 画笔和正被绘制线条的左边对齐Outset 画笔和正被绘制线条的外部对齐 R
18、ight 画笔和正被绘制线条的右边对齐 DashStyle设置了使用该画笔所绘制虚线(dashed line)的样式,用DashStyle枚举的成员表示这些样式,如表 914所示。表 914 DashStyle枚举 成 员 描 述 Custom 说明用户自定义的线条样式 Dash 说明一条虚线 DashDot 说明了具有重复“破折线-点”模式的线条 DashDotDot说明了具有重复“破折线-点-点”模式的线条Dot 说明了点样式的线条 Solid 说明了实心线条(默认值) 线罩(Line cap) 是指线的末端是如何被绘制的,可以用LineCap枚举的成员表示。线罩主要包括了以下几种:圆、正
19、方形、三角形和自定义形。PenType类是System.Drawing.Drawing2D.PenType枚举的成员,可能的取值如表 915所示:表 915 PenType枚举 成 员 描 述 HatchFill 画笔将以阴影图案填充 LinearGradient画笔将以线性渐变填充 PathGradient 画笔以路径渐变填充SolidColor 画笔将以纯色(默认的颜色)填充 TextureFill 画笔将以位图纹理填充 表 916中列出了Pen类最重要的几种方法。表 916 Pen类的方法 方 法 描 述 Clone 创建一个该画笔的准确拷贝 Dispose 释放画笔所用的Windows
20、资源 MultiplyTransform 将转换矩阵与另一个矩阵相乘 ResetTransform 将转换矩阵重新设置 RotateTransform 旋转转换 ScaleTransform 比例转换 SetLineCap 设置画笔的起始和结束的线罩TranslateTransform平移转换 Dispose()方法能释放Pen对象使用的潜在系统资源。尽管在Pen对象被放入回收站或者程序结束时也会释放这些资源,但是为了有效利用系统资源,在结束Pen对象时应该即时调用Dispose()。如果想获取一个Pen对象来表示一种标准颜色,可以使用System.Drawing.Pens类。对于Color类
21、中每一种预定义的颜色,System.Drawing.Pens类都包含相应的Pen对象,如:Pen pen = Pens.AliceBlue;如果想用一个Pen对象描述一种用于UI元件中的默认颜色,就可以使用System.Drawing.SystemPens类。对于每一种预先定义的UI颜色,这个类都有相应的Pen对象,如:Pen = SystemPens.HighlightText;表 917列出了所有能够通过SystemPens类的属性检索到的颜色。表 917 SystemPens类的属性 属 性 描 述 ActiveCaptionText 活动窗口标题栏文本的颜色 Control 按扭或其他
22、控件的颜色 ControlDark 3D元件阴影部分的颜色 ControlDarkDark 3D元件最暗部分的颜色 ControlLight 3D元件高亮部分的颜色 ControlLightLight 3D元件最亮部分的颜色 ControlText 控件上面文本的颜色 GrayText 无效文本的颜色 Highlight 高亮背景的颜色 HighlightText 高亮区域文本的颜色 InactiveCaptionText 非活动窗口标题栏文本的颜色InfoText 在工具提示上的文本颜色 MenuText 菜单上文本颜色 WindowFrame 窗口框架的颜色 WindowText 窗口文本
23、的颜色 DashPattern属性通过为每一个破折线和空格的大小提供一个数组,使得可以自定线条的样式:pen. DashPattern = new float 0.5, 1, 1,5, 2, 2.5 ;例 92 PenTest.cs 使用Pen1 private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)2 3 Graphics g = e.Graphics;4 5 Pen pen;6 Point point = new Point( 10, 10 );7 Size sizeLine = new
24、Size( 0, 150 );8 Size sizeOff = new Size( 30, 0 );9 10 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
25、 = new Pen( Color.Red, 8 );17 g.DrawLine( pen, point+=sizeOff, point+sizeLine );18 19 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 );23 24 pen.DashStyle = DashStyle.Solid;25 pen
26、.StartCap =LineCap.Round;26 g.DrawLine( pen, point+=sizeOff, point+sizeLine );27 pen.EndCap = LineCap.Triangle;28 g.DrawLine( pen, point+=sizeOff, point+sizeLine );29 30 pen. DashPattern = new float 0.5f, 1f, 1,5f, 2f, 2.5f ;31 g.DrawLine( pen, point+=sizeOff, point+sizeLine );32 运行结果如图 92:图 92 使用Pe
27、n9.1.4 刷子刷子用来填充图形的内部。刷子是抽象基类Brush派生出来的类,在System.Drawing中定义了两种刷子类:(1) SolidBrush定义一个单颜色的刷子。(2) TextureBrush定义一个用图像填充图形内部区域的刷子。SolidBrush类只有几个重要成员,如表 918所示。表 918 SolidBrush类的重要成员 成 员 描 述 SolidBrush 设置一个颜色的构造函数 Clone 创建一个该刷子的准确拷贝 Dispose 释放刷子占用的Windows资源 Color 获取或设置刷子的颜色 OnSystemColorChanged当系统颜色发生变化时调
28、用 如果想用一个Brush对象描述一种标准颜色,那么可以使用System.Drawing.Brushes类。对于Color类中预先定义的每一种颜色,这个类都有相应的Bursh对象。如:Brush br = Brushes.Azure;如果想用刷子描述用于UI元件中的一种标准颜色,可以使用System.Drawing.SystemBrushes类。对于每一种预先定义的UI颜色,都有相应的Bursh对象。如:Brush br = SystemBrushes.Desktop;表 919列出了所有能够通过SystemBrushes类的属性检索到的颜色。表 919 SystemBrushes类的属性 属
29、 性 描 述 ActiveBorder 活动窗口边界的颜色 ActiveCaption 活动窗口标题栏的颜色 ActiveCaptionText 活动窗口标题栏的文本颜色 AppWorkspace 它是应用程序工作区的颜色(应用程序工作区是多文档视图中未被文档占据的区域)Control 3D元件的外表颜色 ControlDark 3D元件阴影部分的颜色 ControlDarkDark 3D元件最暗的颜色 ControlLight 3D元件高亮颜色 ControlLightLight 3D元件最亮颜色 ControlText 控件上面文本颜色 Desktop 桌面颜色 Highlight 高亮背景的颜色 HighlightText 高亮文本的颜色 HotTrack 用于表示热跟踪(hot-tracking)的颜色InactiveBorder 活动窗口边界颜色 InactiveCaption 活动窗口标题栏颜色 Info 工具提示的背景颜色 Menu 菜单背景颜色 ScrollBar 滚动条
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1