《【教学课件】第7章C#图形程序设计基础.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第7章C#图形程序设计基础.ppt(49页珍藏版)》请在三一办公上搜索。
1、第7章 C#图形程序设计基础,7.1 GDI+绘图基础7.2 基本图形的绘制7.3 实用图形程序设计,7.1 GDI+绘图基础,7.1.1 图形设备接口GDI+:Graphics Device Interface Plus,它提供了各种丰富的图形图像处理功能在C#.NET中,使用GDI+处理二维(2D)的图形和图像,使用DirectX处理三维(3D)的图形图像 GDI+主要有二维矢量图形、图像处理和版式三部分组成 GDI+提供了存储基元自身相关信息的类和结构、存储基元绘制方式相关信息的类,以及实际进行绘制的类 GDI+为使用各种字体、字号和样式来显示文本这种复杂任务提供了大量的支持其他高级功能
2、,图形图像处理中常常调用的名称空间:System:包括常用基础数据类型和24个子名称空间System.Drawing:提供了对GDI+基本图形功能的访问,主要有Graphics类、Bitmap类、从Brush类继承的类、Font类、Icon类、Image类、Pen类、Color类等:提供了高级的二维和矢量图形功能。主要有梯度型画刷、Matrix类(用于定义几何变换)和GraphicsPath类等:提供了高级 GDI+图像处理功能System.WinForms:提供许多与数据处理相关的结构的类 System.Timers:提供精确的计时操作:提供了高级 GDI+字体和文本排版功能,7.1.2 创
3、建Graphics对象Graphics类包含在System.Drawing名称空间下。要进行图形处理,必须首先创建Graphics对象,然后才能利用它进行各种画图操作,即先创建Graphics对象再使用该对象的方法绘图、显示文本或处理图像。创建Graphics对象的形式有:1.在窗体或控件的Paint事件中直接引用Graphics对象 每一个窗体或控件都有一个Paint事件,该事件的参数中包含了当前窗体或控件的Graphics对象,在为窗体或控件创建绘制代码时,一般使用此方法来获取对图形对象的引用:Private void Form_Paint(object sender,e)Graphics
4、 g=e.Graphics;,2.利用窗体或某个控件的CreateGraphics方法此方法所建对象是该控件或窗体的绘图区域,可把当前窗体的画刷、字体、颜色作为缺省值获取对Graphics对象的引用,注意这种对象只有在处理当前Windows窗口消息的过程中有效;如果想在已存在的窗体或控件上绘图,可以使用此方法。例如:Graphics g=this.CreatGraphics();,3.从继承自图像的任何对象创建Graphics对象此方法在需要更改已存在的图像时十分有用,例如:Bitmap bitmap=new Bitmap(”C:testa1.bmp”);Graphics g=Graphics
5、.FromImage(bitmap);,在图形图像处理程序设计中,与Graphics对象一起使用的用户对象常有:Pen:用于绘制线条、勾勒形状轮廓等;Brush:用于填充图形区域;Font:提供有关在呈现文本时要使用什么形状的说明;Color:该结构表示要显示的不同颜色注意:由于图像对象非常占资源,所以在不用这些对象时要用Dispose方法及时释放资源,附:颜色颜色是进行图形操作的基本要素。任何一种颜色都可以由四个分量决定,每个分量占据一个字节:R:红色,取值范围0255,255为饱和红色 G:绿色,取值范围0255,255为饱和绿色 B:蓝色,取值范围0255,255为饱和蓝色 A:Alph
6、a值,即透明度。取值范围0255,0为完全透明,255为完全不透明在System.Drawing名称空间下,有一个Color结构类型,包含系统已定义的颜色种类。可以使用下列方法创建颜色对象:使用FromArgb指定任意颜色 这个方法有两种常用的形式:,第一种形式是直接指定三种颜色,方法原型为:public static Color FromArgb(int red,int green,int blue)三个参数分别表示R、G、B三色,Alpha值使用缺省值255,即完全不透明;例如:Color red=Color.FromArgb(255,0,0);Color green=Color.From
7、Argb(0,255,0);Color blue=Color.FromArgb(0,0,0 xff);其中,0 xff为十六进制表示形式。第二种形式使用四个参数,格式为:public static Color FromArgb(int alpha,int red,int green,int blue)四个参数分别表示透明度和 R、G、B三色值。,使用系统预定义颜色 在Color结构中已经预定义了141种颜色,可以直接使用,例如:Color myColor;myColor=Color.Red;myColor=Color.Aquamarine;myColor=Color.LightGoldenro
8、dYellow;,7.1.3 创建画笔对象用Pen类创建画笔对象,画笔通常具有宽度、样式和颜色三种属性。1.Pen对象的创建:public Pen(Color color);public Pen(Color color,float width);public Pen(Brush brush);public Pen(Brush brush,float width);如:Pen myPen=new Pen(Color.Black);Pen myPen=new Pen(Color.Black,5);SolidBrush myBrush=new SolidBrush(Color.Red);Pen my
9、Pen=new Pen(myBrush);Pen myPen=new Pen(myBrush,5);,2.Pen对象的属性:画笔对象的属性用于返回或设置画笔对象的颜色、画线样式、画线始点及终点的样式等。常用属性如下:Color:DashCap:DashStyle:EndCap:PenType:StartCap:Width:例:,1)新建一个Windows应用程序,适当加宽窗体宽度。然后切换到代码方式,添加名称空间引用:using System.Drawing.Drawing2D;2)添加Form1_Paint事件代码。private void Form1_Paint(object sender
10、,e)Graphics g=e.Graphics;Pen pen=new Pen(Color.Blue,10.5f);g.DrawString(蓝色,宽度为10.5,this.Font,new SolidBrush(Color.Black),5,5);g.DrawLine(pen,new Point(110,10),new Point(380,10);pen.Width=2;pen.Color=Color.Red;g.DrawString(红色,宽度为2,this.Font,new SolidBrush(Color.Black),5,25);,g.DrawLine(pen,new Point(
11、110,30),new Point(380,30);pen.StartCap=LineCap.Flat;pen.EndCap=LineCap.ArrowAnchor;pen.Width=9;g.DrawString(红色箭头线,this.Font,new SolidBrush(Color.Black),5,45);g.DrawLine(pen,new Point(110,50),new Point(380,50);pen.DashStyle=DashStyle.Custom;pen.DashPattern=new float 4,4;pen.Width=2;pen.EndCap=LineCap
12、.NoAnchor;g.DrawString(自定义虚线,this.Font,new SolidBrush(Color.Black),5,65);g.DrawLine(pen,new Point(110,40),new Point(380,70);pen.DashStyle=DashStyle.Dot;g.DrawString(点划线,this.Font,new SolidBrush(Color.Black),5,85);g.DrawLine(pen,new Point(110,90),new Point(380,90);,运行结果,7.1.4 创建画刷画刷是可与Graphics对象一起使用来
13、创建实心形状和呈现文本的对象。可以用画刷填充各种图形形状,如矩形、椭圆、扇形、多边形和封闭路径等。几种不同类型的画刷:SolidBrush:画刷最简单的形式,用纯色进行绘制 HatchBrush:类似于 SolidBrush,但是可以利用该类从大量预设的图案中选择绘制时要使用的图案,而不是纯色TextureBrush:使用纹理(如图像)进行绘制LinearGradientBrush:使用沿渐变混合的两种颜色进行绘制PathGradientBrush:基于编程者定义的唯一路径,使用复杂的混合色渐变进行绘制,(1)使用SolidBrush类定义单色画笔 SolidBrush类用于定义单色画笔。该类
14、只有一个构造函数,带有一个Color类型的参数。下面的示例说明如何在窗体上绘制一个纯红色的椭圆。该椭圆将符合为其提供的矩形的大小(此例中为表示整个窗体的ClientRectangle)。例:private void Form1_Paint(object sender,e)Graphics g=e.Graphics;SolidBrush myBrush=new SolidBrush(Color.Red);g.FillEllipse(myBrush,this.ClientRectangle);,运行效果,(2)使用HatchBrush类绘制简单图案 HatchBrush类用于从大量预设的图案中选择
15、绘制时要使用的图案,而不是纯色。下面的示例说明如何创建一个HatchBrush,它使用90%的阴影,前景色与背景色的比例为90:100,并使用白色作为前景色,黑色作为背景色。例:private void Form1_Paint(object sender,e)Graphics g=e.Graphics;HatchBrush aHatchBrush=new HatchBrush(HatchStyle.Percent90,Color.White,Color.Black);g.FillEllipse(aHatchBrush,this.ClientRectangle);,运行效果:,(3)使用Text
16、ureBrush类绘制复杂图案 TextureBrush类允许使用一幅图像作为填充的样式。该类提供了5个重载的构造函数,分别是:Public TextureBrush(Image)Public TextureBrush(Image,Rectangle)Public TextureBrush(Image,WrapMode)Public TextureBrush(Image,Rectangle,ImageAttributes)Public TextureBrush(Image,WrapMode,Rectangle)其中:Image:用于指定画笔的填充图案。Rectangle:用于指定图像上用于画笔
17、的矩形区域,其位置不能超 越图像的范围。WrapMode:WrapMode枚举成员用于指定如何排布图像,可以是 Clamp 完全由绘制对象的边框决定 Tile 平铺 TileFlipX 水平方向翻转并平铺图像 TileFlipY 垂直方向翻转并平铺图像 TileFlipXY 水平和垂直方向翻转并平铺图像,ImageAttributes:用于指定图像的附加特性参数。TextureBrush类有三个属性:Image:Image类型,与画笔关联的图像对象。Transform:Matrix类型,画笔的变换矩阵。WrapMode:WrapMode枚举成员,指定图像的排布方式。下面的示例说明了如何创建一个
18、TextureBrush,例子使用名为m23.jpg的图像进行绘制。例:private void Form1_Paint(object sender,e)Graphics g=e.Graphics;TextureBrush myBrush=new TextureBrush(new Bitmap(e:testm23.jpg);g.FillEllipse(myBrush,this.ClientRectangle);,运行效果:,(4)使用LinearGradientBrush类定义线性渐变 这个类用于定义线性渐变画笔,可以是双色渐变,也可以是多色渐变。缺省情况下,渐变由起始颜色沿着水平方向平均过渡
19、到终止颜色。要定义多色渐变,需要使用InterpolationColors属性。下面的示例说明如何由白色渐变到蓝色。例:private void Form1_Paint(object sender,e)Graphics g=e.Graphics;LinearGradientBrush myBrush=new LinearGradientBrush(this.ClientRectangle,Color.White,Color.Blue,LinearGradientMode.Vertical);g.FillRectangle(myBrush,this.ClientRectangle);,如果创建应
20、用程序后向设计窗体上拖放一些控件,可以看到运行后该图就是一个漂亮的背景了。,(5)使用PathGradientBrush类实现彩色渐变 在GDI+中,把一个或多个图形组成的形体称作路径。可以使用GraphicsPath类定义路径,使用PathGradientBrush类定义路径内部的渐变色画笔。渐变色从路径内部的中心点逐渐过渡到路径的外边界边缘。PathGradientBrush类有三种形式的构造函数,形式之一是:public PathGradientBrush(GraphicsPath path)其中,GraphicsPath定义画笔填充的区域。例,路径和路径画笔的使用:using Syst
21、em.Drawing.Drawing2D;,private void Form1_Paint(object sender,e)Graphics g=e.Graphics;Point centerPoint=new Point(150,100);int R=60;GraphicsPath path=new GraphicsPath();path.AddEllipse(centerPoint.X-R,centerPoint.Y-R,2*R,2*R);PathGradientBrush brush=new PathGradientBrush(path);/指定路径中心点brush.CenterPoi
22、nt=centerPoint;/指定路径中心点的颜色brush.CenterColor=Color.Red;/Color类型的数组指定与路径上每个顶点对应的颜色brush.SurroundColors=new Color Color.Plum;,g.FillEllipse(brush,centerPoint.X-R,centerPoint.Y-R,2*R,2*R);centerPoint=new Point(350,100);R=20;path=new GraphicsPath();path.AddEllipse(centerPoint.X-R,centerPoint.Y-R,2*R,2*R)
23、;path.AddEllipse(centerPoint.X-2*R,centerPoint.Y-2*R,4*R,4*R);path.AddEllipse(centerPoint.X-3*R,centerPoint.Y-3*R,6*R,6*R);brush=new PathGradientBrush(path);brush.CenterPoint=centerPoint;brush.CenterColor=Color.Red;brush.SurroundColors=new Color Color.Black,Color.Blue,Color.Green;g.FillPath(brush,pa
24、th);,在这个例子中,可以看到当使用FillPath()方法填充路径的时候,如果多个图形互相重叠,则重叠部分的数目为偶数时不会被填充,因此右图中间部分仍为背景色而不是蓝色。,附:平移、旋转与缩放,Graphics类提供了三种对图像进行几何变换的方法,它们是TranslateTransform()方法、RotateTransform()方法和ScaleTransform()方法,分别用于图形图像的平移、旋转和缩放(以坐标系原点为中心)。TranslateTransform()方法的形式为:public void TranslateTransform(float dx,float dy)其中,d
25、x表示平移的x分量,dy表示平移的y分量;RotateTransform()方法的形式为:public void RotateTransform(float angle)其中,angle表示旋转角度;ScaleTransform()方法的形式为:public void ScaleTransform(float sx,float sy)其中,sx表示x方向的缩放比例,sy表示y方向的缩放比例;,例:三种变换方法示例。private void Form1_Paint(object sender,e)Graphics g=e.Graphics;g.FillEllipse(new SolidBrush
26、(Color.FromArgb(80,Color.Red),120,30,200,100);/椭圆透明度80%g.RotateTransform(30.0f);/顺时针旋转30度g.FillEllipse(new SolidBrush(Color.FromArgb(80,Color.Blue),120,30,200,100);/水平方向向右平移200个像素,垂直方向向上平移100个像素g.TranslateTransform(200.0f,-100.0f);g.FillEllipse(new SolidBrush(Color.FromArgb(50,Color.Green),120,30,20
27、0,100);g.ScaleTransform(0.5f,0.5f);/缩小到一半 g.FillEllipse(newSolidBrush(Color.FromArgb(100,Color.Red),120,30,200,100);,7.2 基本图形的绘制,1.画点VC#采用Point结构和SetPixel()方法完成画点的功能;其中Point用于图形设计,SetPixel()用于图像处理Point原型:public struct Point;使用:public Point p1=new Point();每个点结构有x和y两个属性,表示横纵坐标,如:p1.x=30;p1.y=100;,2.画直
28、线1)DrawLine方法public void DrawLine(Pen pen,int x1,int y1,int x2,int y2);或 public void DrawLine(Pen pen,Point pt1,Point pt2);如:Graphics g=this.CreateGraphics();Pen p1=new Pen(Color.Red,2);Point pt1=new Point(40,50);Point pt2=new Point(220,150);g.DrawLine(p1,10,20,40,50);g.DrawLine(p1,pt1,pt2);2)DrawLi
29、nes方法public void DrawLines(Pen pen,Point pts);,private void Form1_Paint(object sender,e)Pen pen=new Pen(Color.Black,3);Point points=new Point(10,10),new Point(10,100),new Point(200,50),new Point(250,120);e.Graphics.DrawLines(pen,points);,效果,3.画椭圆1)public void DrawEllipse(Pen pen,int x,int y,int widt
30、h,int height)其中x,y为椭圆外接矩形左上角的坐标,width定义椭圆的外接矩形的宽度,height定义椭圆外接矩形的高度。2)public void DrawEllipse(Pen pen,Rectangle rect)其中rect为Rectangle结构,用于确定椭圆的外接矩形。,4.绘制圆弧public void DrawArc(Pen pen,int x,int y,int width,int height,int startAngle,int sweepAngle)各参数意义:例:Graphics g=this.CreateGraphics();Pen pen=new P
31、en(Color.Red,2);g.Clear(this.BackColor);g.DrawArc(pen,0,0,200,300,-60,180);,5.DrawPiepublic void DrawPie(Pen pen,int x,int y,int width,int height,int startAngle,int sweepAngle)各参数意义:例:Graphics g=this.CreateGraphics();Pen pen=new Pen(Color.Red,2);g.Clear(this.BackColor);g.DrawPie(pen,60,60,160,160,16
32、0,200);,6.画矩形1)public void DrawRectangle(Pen pen,int x,int y,int width,int height)参数含意:2)public void DrawRectangle(Pen pen,Rectangle rect)参数含意:例:private void Form1_Paint(object sender,e)Graphics g=e.Graphics;Pen pen=new Pen(Color.Black,3);Rectangle rect=new Rectangle(30,30,200,100);(pen,rect);,3)pub
33、lic void DrawRectangles(Pen pen,Rectangle rects)该方法用于绘制多个矩形。例:private void Form1_Paint(object sender,e)Graphics g=e.Graphics;Pen pen=new Pen(Color.Black,3);Rectangle rects=new Rectangle(0,0,100,200),new Rectangle(100,200,250,50),new Rectangle(300,0,50,100);(pen,rects);,7.Bezier每段贝塞尔曲线都需要四个点,第一个点是起始点
34、,第四个点是终止点,第二个点和第三个点控制曲线的形状。使用DrawBezier()方法绘制一段贝塞尔曲线,使用DrawBeziers()方法绘制多段贝塞尔曲线。常用形式有:1)public void DrawBezier(Pen pen,float x1,float y1,float x2,float y2,float x3,float y3,float x4,float y4)2)public void DrawBezier(Pen pen,Point pt1,Point pt2,Point pt3,Point pt4)3)public void DrawBeziers(Pen pen,Po
35、int points)其中points是Point结构的数组,第一段贝塞尔曲线从点数组中的第一个点到第四个点绘制而成。以后每段曲线只需要三个点:两个控制点和一个结束点。前一段曲线的结束点会自动用作后一段曲线的起始点。,例:private void Form1_Paint(object sender,e)Pen blackPen=new Pen(Color.Black,3);Point bezierPoints=new Point(50,100),new Point(100,10),new Point(150,290),new Point(200,100),new Point(250,10),n
36、ew Point(300,290),new Point(350,100);(blackPen,bezierPoints);,8.DrawPolygonpublic void DrawPolygon(Pen pen,Point points);public void DrawPolygon(Pen pen,PointF points);其中:PointF表示在二维平面中定义点的、浮点 x 和 y 坐标的有序对 例:画一个四边形private void button_Click(object sender,System.EventArgs e)Graphics g=this.CreateGraph
37、ics();Pen pen=new Pen(Color.Red,2);g.Clear(this.BackColor);Point p1=new Point new Point(10,120),new Point(120,100),new Point(300,180),new Point(60,200);g.DrawPolygon(pen,p1);,9.DrawClosedCurve方法这个方法用平滑的曲线将各节点连接起来,但会自动把首尾节点连接起来构成封闭曲线。public void DrawClosedCurve(Pen pen,Point pts);public void DrawClos
38、edCurve(Pen pen,PointF pts);public void DrawClosedCurve(Pen,Point,float,FillMode);public void DrawClosedCurve(Pen,PointF,float,FillMode);其中float型参数指定弯曲强度,该值范围为0.0f 1.0f,超出此范围会产生异常,当弯曲强度为零时,就是直线,默认张力为0.5。例:Pen blackPen=new Pen(Color.Black);Point p1=new Point new Point(10,120),new Point(120,100),new P
39、oint(300,180),new Point(60,200);g.DrawClosedCurve(blackPen,p1);,10.DrawCurve方法绘制经过一组指定的Point结构数组定义的曲线,最后一个点与第一个点间不画线。public void DrawCurve(Pen pen,Point pts);public void DrawCurve(Pen pen,PointF pts);public void DrawCurve(Pen,Point,float);public void DrawCurve(Pen,PointF,float);其中float参数代表曲线弯曲的强度。例:
40、private void button_Click(object sender,System.EventArgs e)Graphics g=this.CreateGraphics();g.Clear(this.BackColor);Pen blackPen=new Pen(Color.Black,3);Point p1=new Point new Point(10,120),new Point(120,100),new Point(300,180),new Point(60,200);g.DrawCurve(blackPen,p1);,例:绘制直线与平滑曲线private void Form1
41、_Paint(object sender,e)Pen redPen=new Pen(Color.Red,3);Pen greenPen=new Pen(Color.Green,3);Point curvePoints=new Point(50,250),new Point(100,25),new Point(200,250),new Point(250,50),new Point(300,75),new Point(350,200),new Point(400,150);e.Graphics.DrawLines(redPen,curvePoints);e.Graphics.DrawCurve(
42、greenPen,curvePoints);,11.DrawPath方法路径通过组合直线、矩形和简单的曲线形成的,可通过Graphics类的DrawPath方法来绘制整个路径的各个对象。public void DrawPath(Pen pen,GraphicsPath path);例:private void button_Click(object sender,System.EventArgs e)Graphics g=this.CreateGraphics();GraphicsPath graphPath=new GraphicsPath();graphPath.AddEllipse(0,
43、0,200,100);graphPath.AddRectangle(new Rectangle(100,80,200,100);graphPath.AddBezier(30,60,70,60,50,30,100,10);Pen blackPen=new Pen(Color.Black,3);g.DrawPath(blackPen,graphPath);,12.FillEllipse该方法用于画一个填充椭圆,常用格式有:public void FillEllipse(Brush brush,int x,int y,int width,int height);public void FillEll
44、ipse(Brush brush,RectangleF rect);参数意义:例:private void button_Click(object sender,System.EventArgs e)Graphics g=this.CreateGraphics();g.Clear(this.BackColor);Brush sp=new SolidBrush(Color.Red);g.FillEllipse(sp,80,90,200,100);,13.FillRectangle该方法用于画一个填充矩形,常用格式有:public void FillRectangle(Brush brush,in
45、t x,int y,int width,int height);2)public void FillRectangle(Brush brush,Rectangle rect);参数意义:例:private void button_Click(object sender,System.EventArgs e)Graphics g=this.CreateGraphics();g.Clear(this.BackColor);Brush sp=new SolidBrush(Color.Red);g.FillRectangle(sp,80,90,200,100);,14.FillPie该方法用于画一个填
46、充饼图,常用格式有:public void FillPie(Brush brush,int x,int y,int width,int height,int startAngle,int sweepAngle);2)public void FillPie(Brush brush,RectangleF rect,float startAngle,float sweepAngle);参数意义:例:private void button_Click(object sender,System.EventArgs e)Graphics g=this.CreateGraphics();g.Clear(this.BackColor);Brush sp=new SolidBrush(Color.Red);g.FillPie(sp,80,90,200,100,-60,300);,