第六章GDI+编程议程•.NET图形编程概述•画笔和画刷•图形的绘制•文本和字体•双缓冲一、图形编程概述•1.GDI+技术简介•GDI:GraphicsDeviceInterface•GDI+是一种构成MicrosoftWindowsXP操作系统的子系统的应用程序编程接口(API)。GDI+负责在屏幕和打印机上显示信息。•GDI+:GDI的改进,同时也是.NET框架结构的重要组成部分。和GDI一样它提供了对二维图形图像和文字排版处理的支持。•通过GDI+能够创建与设备无关的应用程序。GDI+提供的新特性:-Alpha混合技术-反锯齿处理技术-渐变色和纹理填充-宽线条-基本几何曲线样式-可缩放区域-浮点数坐标-嵌入画笔-高质量过滤和缩放-多种线条样式和端点选项6.1坐标系统•GDI+在坐标系中绘制直线、矩形和其他形状。我们可以从各种各样的坐标系统中选择,但默认系统的原点是在左上角,并且x轴指向右边,y轴指向下边。默认坐标系统的度量单位是像素。(0,0)(x,0)(0,y)注:x,y为屏幕的分辨率6.2Graphics类•Graphics类是使用GDI+的基础,它代表了所有输出显示的绘图环境,用户可以通过编程操作Graphics对象,在屏幕上绘制图形、呈现文本或操作图像。•创建Graphics对象可以有多种方法。(1)Paint事件在为窗体编写Paint事件处理程序时,图形对象作为一个PaintEventArgs类的实例提供。下面的代码引用Paint事件的PaintEventArgs中的Graphics对象:•privatevoidForm1_Paint(objectsender,PaintEventArgspe)•{•//声明图形对象并把它设置为PaintEventArgs事件提供的图形对象•Graphicsg=pe.Graphics;•//在这插入绘制窗体的代码•}•(2)CreateGraphics方法•使用控件或窗体的CreateGraphics()方法来获取对Graphics对象的引用,该对象表示这个控件或窗体的绘图表面。例如:•Graphicsg;//把g设为一个图形对象,来表示控件或窗体的绘图平面•g=this.CreateGraphics();//this可替换成其他的控件名,用this的话将form创建为画布•(3)Graphics.FromImage方法•从Image类派生的任何对象创建图形对象,调用Graphics.FromImage()方法即可。例如:•BitmapmyBitmap=newBitmap(@C:\myPic.bmp);•Graphicsg=Graphics.FromImage(myBitmap);•在GDI+中,可使用“画笔”和“画刷”对象来呈现图形、文本和图像。画笔是Pen类的实例,可用于绘制线条和空心形状。画刷是从抽象类Brush类派生的任何类的实例,可用于填充形状或绘制文本。Color对象是表示特定颜色类的实例,画笔和画刷可使用构造函数来指定它所呈现的图形的颜色。例如:•PenmyPen=newPen(Color.Red);//创建一个红色的笔.•SolidBrushmyBrush=newSolidBrush(Color.Blue);//创建一个深蓝的画刷.Graphics类的常用属性和方法分别如表6-1和表6-2所示。表6-1Graphics类的常用属性表6-2Graphics类的常用方法二、绘图•.NET提供了绘制各种图形的功能。它允许用户在窗体及其中的各种对象上绘制直线、矩形、多边形、圆、椭圆、圆弧、曲线、饼图等图形状态。•2.1画笔•画笔(Pen)用于绘制直线和曲线,无法继承此类,它在System.Drawing命名空间中。画笔可用于绘制线条、曲线以及勾勒形状轮廓。下面的代码创建一支基本的黑色画笔:•PenmyPen=newPen(Color.Black);//创建一个默认宽度为1的黑色画笔•PenmyPen=newPen(Color.Black,5);//创建一个宽度为5的黑色画笔•也可以通过已存在的画刷对象创建画笔。下面的代码创建基于已存在画刷(名为myBrush)的画笔:•PenmyPen=newPen(myBrush);//创建一个画笔,与myBrush有相同的属性,并且默认宽度为1。•PenmyPen=newPen(myBrush,5);//创建一个画笔,与myBrush有相同的属性,并且宽度为5.•在画笔创建后,可以设置画笔的线条形式的各种属性。Width和Color等属性会影响线条的外观,而StartCap和EndCap属性将预设或自定义的形状添加到线条的开始或结尾。DashStyle属性允许在实线、虚线、点划线或自定义点划线之间进行选择,而DashCap属性可以自定义线条中短划线的结尾。•2.2画刷•画刷是与Graphics对象一起使用来创建实心形状和呈现颜色与图案的对象。几种不同类型的画刷如表6-3所示。•所以这些类均是从Brush类继承的,该类是抽象类,不能实例化。表6-3画刷的类型•例6.1设计WinForm应用程序分别使用画笔和画刷画出以坐标(30,30)和(130,30)为起点的长为70、高为50的矩形。•2.3绘制直线绘制直线时,可以调用Graphics类中的DrawLine方法,该方法为可以重载方法,主要用来绘制一条连接由坐标对指定的两个点的线条,其常用格式有以下两种:1)绘制一条连接两个Point结构的线,如下所示:Graphicsg=this.CreateGraphics();g.DrawLine(PenmyPen,Pointpt1,Pointpt2);其中笔对象myPen确定线条的颜色、宽度和样式。pt1是Point结构,它表示要连接的一个点。Pt2是Point结构,表示要连接的另一个点。2)绘制一条连接由坐标对指定的两个点的线条,如下所示:Graphicsg=this.CreateGraphics();g.DrawLine(PenmyPen,intx1,inty1,intx2,inty2);DrawLine方法中各参数及说明如表6-4所示。6-4DrawLine方法中各参数及说明•例6.2设计WinForm应用程序分别使用以上介绍的方法绘制直线。•2.4绘制矩形可以调用Graphics类中的DrawRectangle方法来绘制矩形,该方法为可重载方法,主要用来绘制由坐标对、宽度和高度指定的矩形,其常用格式有以下两种。1)绘制由Rectangle结构指定的矩形,如下所示:Graphicsg=this.CreateGraphics();g.DrawRectangle(PenmyPen,Rectanglerect);其中myPen为笔Pen的对象,它确定矩形的颜色、宽度和样式。rect表示要绘制矩形的Rectangle结构。例如,声明一个Rectangle结构,代码如下:Rectanglerect=newRectangle(30,30,100,80);//以(30,30)为起点长为100,高为80的矩形2)绘制由坐标对、宽度和高度指定的矩形,如下所示:Graphicsg=this.CreateGraphics();g.DrawRectangle(PenmyPen,intx,inty,intwidth,intheight);•2.5绘制椭圆绘制椭圆时,可以调用Graphics类中的DrawEllipse方法,该方法为可重载方法,主要用来绘制边界由Rectangle结构指定的椭圆,其常用格式有以下两种。1)绘制边界由Rectangle结构指定的椭圆,如下所示:Graphicsg=this.CreateGraphics();g.DrawEllipse(PenmyPen,Rectanglerect);其中myPen为笔Pen的对象,它确定曲线的颜色、宽度和样式。Rect为Rectangle结构,定义椭圆的边界。2)绘制一个由边框(该边框由一对坐标、高度和宽度指定)指定的椭圆,如下所示:Graphicsg=this.CreateGraphics();g.DrawEllipse(PenmyPen,intx,inty,intwidth,intheight);•2.6绘制圆弧绘制圆弧时,可以调用Graphics类中的DrawArc方法,该方法为可重载方法,主要用来绘制一段弧线,其常用格式有以下两种。1)绘制一段弧线,它表示由Rectangle结构指定的椭圆的一部分,如下所示:Graphicsg=this.CreateGraphics();g.DrawArc(PenmyPen,Rectanglerect,startAngle,sweepAngle);DrawArc方法中各参数及说明下表所示:参数说明myPenPen对象,它确定弧线的颜色、宽度和样式rectRectangle结构,它定义椭圆的边界startAngle从x轴到弧线的起始点沿顺时针方向度量的角(以度为单位)sweepAngle从startAngle参数到弧线的结束点沿顺时针方向度量的角(以度为单位)2)绘制一段弧线,它表示由一对坐标、宽度和高度指定的椭圆部分,如下所示:Graphicsg=this.CreateGraphics();g.DrawArc(PenmyPen,intx,inty,intwidth,intheight,startAngle,sweepAngle);•2.7绘制多边形绘制多边形需要Graphics对象、Pen对象和Point或PointF(对象数组)。Graphics对象提供DrawPolygon方法绘制多边形,Pen对象存储用于呈现多边形的线条属性,例如,宽度和颜色等,Point存储多边形的各个顶点。Pen对象和Point或PointF作为参数传递给DrawPolygon方法。其中数组中的每对相邻的两个点指定多边形的一条边。另外,如果数组的最后一个点和第一个点不重合,则这两个点指定多边形的最后一条边,其常用格式有以下两种:1)绘制由一组Point结构定义的多边形,如下所示:Graphicsg=this.CreateGraphics();g.DrawPolygon(PenmyPen,Point[]points);myPen为Pen对象,用来确定多边形的颜色、宽度和样式。points为Point结构数组,这些结构表示多边形的顶点。2)绘制由一组PointF结构定义的多边形,如下所示:Graphicsg=this.CreateGraphics();g.DrawPolygon(PenmyPen,Point[]points);myPen为Pen对象,用来确定多边形的颜色、宽度和样式。points为Point结构数组,这些结构表示多边形的顶点。三、颜色.NET框架的Color结构用于表示不同的颜色。颜色与画笔和画刷一起使用来指定要呈现的颜色。1.系统定义的颜色可以通过Color结构访问若干系统定义的颜色。这些颜色的示例如下:ColormyColor;myColor=Color.Red;ColormyColor=Color.Red;上面的语句为myColor分配系统定义的颜色。2.用户定义的颜色可以使用Color.FromArgb()方法创建用户定义的颜色。定义时,可以指定一种颜色中红色、蓝色和绿色各部分的强度。ColormyColor=Color.FromArgb(23,56,78);此示例生成一种用户定义的颜色,该颜色大致为略带蓝色的灰色。每个数字均必须是从0到255之间的一个整数,其中0表示没有该颜色,而255则为所指定颜色的完整饱和度。因此,Color.FromArgb(0,0,0)呈现为黑色,而Color.FromArgb(255,255,255)呈现为白色。3.Alpha混合处理(透明度)Alpha表示所呈现图形后面的对象透明度。Alpha混合处理的颜色对于各种底纹和透明度效果很有用。如果需要指定Alpha部分,则它应为Color.FromArgb()方法中四个参数