VC15_13GDI+图形编程_第1页
VC15_13GDI+图形编程_第2页
VC15_13GDI+图形编程_第3页
VC15_13GDI+图形编程_第4页
VC15_13GDI+图形编程_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、(12)图形绘制图形绘制暨南大学电气信息学院严东松2013-2014学年第二学期第5章 GDI+编程基础5.1 GDI+概述概述5.2 图形绘制图形绘制5.1 GDI+概述Y 5.1.1 GDI+的组成部分的组成部分 1二维矢量图形二维矢量图形二维矢量图形是由绘图的图元(如直线、曲线和图形等)组成,而这些图元由二维坐标系统中的一系列坐标点组成。GDI+提供了相关的类来存储这些图元本身信息,并绘制这些图元。例如,在.NET中的Rectangle类用来描述矩形的位置和尺寸;Pen类用来描述线条的颜色、粗细及线型等信息;而Graphics类则提供了用于绘制直线、矩形和其他图形的方法。5.1.1 GD

2、I+的组成部分 2图像处理图像处理对于许多的图片,基本上都难以以简单的直线或曲线来描述图像的信息,所以也无法通过使用二维矢量图形方式进行处理。这种类型的图像通常比矢量图形要复杂得多,所以通过位图来描述这类图像信息。位图存储方式通过图像表示在屏幕上独立点的颜色值来描述图像信息。GDI+提供了Bitmap、Image等类,它们可用于显示、操作和保存BMP、JPG和GIF等图像格式。 3文字显示文字显示文字显示关系到多种文字的字体、尺寸及样式显示。可以利用GDI+提供的子像素反锯齿功能,以使文本在屏幕上呈现时显得比较平滑。此外,Windows Froms还专门提供了TextReader类,以用于在W

3、indows窗体控件上测量和绘制文本。5.1.2 GDI+的接口架构GDI+包含大约40个类、50个枚举和6个结构体,以及不属于任何类的少数几个公有函数。其中,Graphics类是整个GDI+接口的核心,它是实际进行线条、曲线、图形、图像和文本绘制的类。GDI+中常用的类及结构如图5.1所示。5.2 图形绘制GDI+中的Graphics类具有绘图、字体及颜色控制功能,并还提供了一系列与图形、图像有关的处理方法。Graphics类中常用的方法如表5.1所示。绘 图 方 法说 明DrawArc绘制一段弧线,它表示由一对坐标、宽度和高度指定的椭圆部分DrawBezier绘制由四个Point结构定义的

4、贝济埃曲线DrawCurve绘制一组经过指定的Point结构的基数线条DrawEllipse绘制一个由一对坐标、高度和宽度指定的椭圆DrawLine绘制一条连接由坐标对指定的两个点的线段DrawPolygon绘制由一组Point结构定义的多边形DrawRectangle绘制由坐标对、宽度和高度指定的矩形5.1.3 常用基本数据结构1. Point、Size和和Rectangle结构的构造函数结构的构造函数Point结构用来表示二维平面中定义的点或一个位置(x, y),其属性有X和Y,分别表示点的水平坐标和垂直坐标。该结构的构造函数原型如下:Point( int dw );Point( Size

5、 sz );Point( int x, int y );Size结构常用来表示一个矩形的大小,其属性有Width和Height,分别表示水平宽度和垂直高度。该结构的构造函数原型如下:Size( Point pt );Size( int width, int height );5.1.3 常用基本数据结构Rectangle结构用来表示一个矩形的位置和大小,其属性有:Width 矩形水平宽度Height 矩形垂直高度X、Y 矩形左上角的x,y坐标Location 矩形左上角的Point位置Left 矩形左边的x坐标Right 矩形右边的x坐标Top 矩形上边的y坐标Bottom 矩形下边的y坐标R

6、ectangle的构造函数原型如下:Rectangle( Point location, Size size );Rectangle( int x, int y, int width, int height );5.1.3 常用基本数据结构2. 基本运算符操作基本运算符操作(1)“+”操作操作若向Point对象加上一个Size对象,则返回Point对象。例如:Drawing:Point pt = Drawing:Point(25,-18)+Drawing:Size(10,5);(2)“-”操作操作若从CPoint对象减去一个CSize对象,则返回一个CPoint对象。例如:Drawing:Po

7、int pt = Drawing:Point( 25, -19 ) + Drawing:Size( 15, 5 );9.1.3 常用基本数据结构3. Rectangle结构的常用操作结构的常用操作(1)扩大或缩小)扩大或缩小成员方法Inflate用来扩大或缩小一个矩形,当参数为负值时,则操作的结果是缩小矩形,其原型如下:void Inflate( Size size );void Inflate( int width, int height );(2)相交和合并)相交和合并成员方法Intersect和Union分别用来将两个矩形进行相交和合并。它们的原型如下:void Intersect( R

8、ectangle rect );static Rectangle Intersect( Rectangle a, Rectangle b );/ 静态方法static Rectangle Union( Rectangle a, Rectangle b );/ 静态方法9.1.3 常用基本数据结构(3)偏移)偏移Offset方法用来调整矩形的位置,但不改变大小,其原型如下:void Offset( Point pos );void Offset( int x, int y );(4)测试和判断)测试和判断IntersectsWith方法用来判断是否和指定的矩形相交,若有相交,则返回true,否则

9、返回false,其原型如下:bool IntersectsWith( Rectangle rect );Contains方法用来判断指定的点或矩形是否完全落在矩形中,若是,则返回true,否则返回false,其原型如下:bool Contains( Point pt );bool Contains( int x, int y );bool Contains( Rectangle rect );5.2 绘图基础5.2.1 使用使用GDI+的一般方法的一般方法在Windows窗体应用程序中,窗体和控件常常需要绘制自己,以维持其界面的外观,此时就会引发Paint事件,在该事件的处理方法中添加代码就可

10、实现相应的绘图操作。:Void On_Paint(System:Object sender,System:Windows:Forms:PaintEventArgs e)e有两个重要属性:Cliprectangle-用于获取在其中可以进行绘画的区域大小Graphics-用于绘画的Graphics对象下面来看一个示例,它是在窗体中绘制一个白色背景的矩形,并在其中绘制一个红色的矩形框,如图9.2所示。5.2.1 使用GDI+的一般方法【例例Ex_Draw】使用使用GDI+的一般方法的一般方法 创建一个Windows窗体应用程序Ex_Draw。在打开的窗体设计器中,单击Form1窗体,在窗体属性窗口中

11、,将Text属性内容修改成“使用GDI+的一般方法”。 将窗体属性窗口切换到事件页面,为窗体添加Paint事件处理方法On_Paint,并添加下列代码:private: System:Void On_Paint(System:Object sender, System:Windows:Forms:PaintEventArgs e) Graphics pGH= e-Graphics; Rectangle rc= e-ClipRectangle; / 绘制填充矩形 pGH-FillRectangle( Brushes:White,rc ); rc.Inflate( -20, -20 );/ 缩小矩

12、形 / 绘制矩形框 pGH-DrawRectangle( Pens:Red, rc ); 编译并运行。5.2 图形绘制在使用GDI+中的Graphics类绘制二维矢量图形前,首先需要为Graphics对象创建相应的Pen对象。创建Pen对象时可以设置线条的颜色和宽度,或者修改Pen对象的属性以表示更多的特性,然后调用Graphics对象的相关绘图方法如DrawLine和DrawRectangle等来绘制相应的二维矢量图形。例如:Graphics graphic = label-CreateGraphics(); / 取得Graphics对象Pen pen = gcnew Pen(Color(2

13、55, 255, 0, 0), 4);/ 创建Pen对象(红色,宽度2)graphic-DrawRectangle(pen, rect(120, 120, 300, 300); / 绘制一个矩形5.2.1 画笔Pen类Pen类指定了直线或线条的宽度和样式。在创建Pen类的新对象时,可以为Pen类的实例指定初始颜色或宽度。其中,Pen类的Width属性指定了绘制图形对象的单位,而该度量单位通常为像素。PenType属性用于描述线条的类型,其值由Pen类的Brush属性确定。画笔的类型及对应的Brush类如表5.2所示。画 笔 类 型Brush类描 述SolidColorSolidBrush画笔的

14、最简单形式,它用纯色进行填充HatchFillHatchBrush类似于SolidBrush,用指定的图案填充TextureFillTextureBrush使用纹理(如图像)进行填充PathGradientPathGradientBrush根据指定的路径使用渐变色进行填充LinearGradientLinearGradientBrush使用渐变混合的两种颜色进行填充5.2.1 画笔Pen类DashStyle属性则指定了虚线的样式,其值是由System:Drawing:Drawing2D命名空间中的DashStyle枚举指定的。DashStyle枚举中的成员及对应的画笔样式如表5.3所示。画 笔

15、 样 式描 述图 例Solid实线风格Dash虚线风格Dot点线风格DashDot点画线风格DashDotDot双点线风格Custom用户定义的线条样式5.2.1 画笔Pen类在创建Pen对象时,可以用指定的颜色或Brush对象来初始化Pen类的新实例,并且还可以为画笔指定线条的宽度,默认宽度为1个像素。例如:Pen pen1 = gcnew Pen(Color:Red); / 默认宽度为1个像素的红色画笔Pen pen2 = gcnew Pen(Color:Blue, 2); / 宽度为2个像素的蓝色画笔Pen pen3 = gcnew Pen(Brushes:Gray);/ 具有灰色画刷属

16、性的1个像素宽的画笔Pen pen4 = gcnew Pen(Brushes:Black, 5);/ 具有黑色画刷属性的5个像素框的画笔pen4-DashStyle = DashStyle:Dash; / 虚线5.2.1 画笔Pen类成 员 名 称描 述表 现 样 式Flat线帽样式为平线帽Square线帽样式为方线帽Round线帽样式为圆线帽Triangle线帽样式为三角线帽NoAnchor线帽样式中没有锚点SquareAnchor具有方形锚头的线帽样式RoundAnchor具有圆角锚头的线帽样式DiamondAnchor具有菱形锚头的线帽样式ArrowAnchor具有箭头锚头的线帽样式在使

17、用该Pen对象绘制线条时,还可以通过Pen类的StartCap和EndCap属性来指定线条的起始点和结束点的线帽样式。其中,这两个属性由LineCap枚举指定,其表现样式可以为扁平、方块、圆角、三角或者用户定义形状等。LineCap枚举中的成员及其对应的表现样式如表5.4所示。5.2.3 画笔自定义画笔自定义画笔在工程应用中,预定义样式DashStyle的画笔有时并不能满足实际的需求,此时需要通过Pen类的DashPattern属性来指定,并须将DashStyle属性设置为DashStyle:Custom。【例例Ex_CustomPen】使用自定义画笔使用自定义画笔 创建一个Windows窗体

18、应用程序Ex_CustomPen。在打开的窗体设计器中,单击Form1窗体,在窗体属性窗口中,将Text属性内容修改成“使用自定义画笔”。 将窗体属性窗口切换到事件页面,为窗体添加Paint事件处理方法On_Paint,并添加下列代码:private: System:Void On_Paint(System:Object sender,System:Windows:Forms:PaintEventArgs e) Graphics pGH = e-Graphics; pGH-PageUnit = GraphicsUnit:Millimeter;/ 设单位为mm / 设置图形显示质量为高品质 pG

19、H-SmoothingMode = Drawing2D:SmoothingMode:HighQuality; Pen pPen = gcnew Pen( Color:Black, 1.5); / 画粗实线圆,线宽为1.5mm pGH-DrawArc( pPen, 10, 10, 40, 40, 0, 360 ); array dashVals = gcnew array 30.0f, / 短划长短划长 2.0f,/ 间隔间隔 2.0f,/ 短划长短划长 2.0f/ 间隔间隔 ; pPen-DashStyle = Drawing2D:DashStyle:Custom; pPen-DashPatt

20、ern= dashVals; / 在工程上,细线线宽是粗线线宽的1/3,为0.5mm pPen-Width= 0.5; pGH-DrawLine( pPen, 5, 30, 55, 30 );/ 画水平点划线 pGH-DrawLine( pPen, 30, 5, 30, 55 );/ 画垂直点划线9.2.3 画笔 编译运行,结果如图9.5所示。5.2.2 画刷Brush类 1SolidBrushSolidBrush类表示一个实心画刷,用于以纯色来填充图形,并且被包含在与Bursh类相同的命令空间System:Drawing中。当需要创建一个实心画刷时,通过将保存在Color对象的颜色值传递给S

21、olidBrush类的构造函数来实现。例如:SolidBursh bush1 = gcnew SolidBrush(Color:Blue); / 创建蓝色的实心画刷5.2.2 画刷Brush类2HatchBrushHatchBrush类中定义了54种不同的阴影样式。其中该类的ForegroundColor属性定义了线条的前景颜色值,BackgroundColor属性定义了各线条之间间隙的背景颜色值,而HatchSyle属性则指定了实际的阴影样式。HatchBrush中的部分阴影样式如表5.5所示。阴 影 样 式图 例阴 影 样 式图 例BackwardDiagonoalLargeGridCro

22、ssLightDownwardDiagonalDarkDownwardDiagonalLightHorizontalDarkHorizontalLightUpwardDiagonalDarkUpwardDiagonalLightVerticalDarkVerticalNarrowHorizontalDashedHorizontalOutlinedDiamandDashedVerticalShingleDiagonalBrickSmallCheckerBoardDiagonalCrossSmallConfettiDottedDiamondSolidDimandHorizontalVertical

23、HorizontalBrickWaveLargeConfettiZigZag【例例Ex_Hatch】Hatchstyle枚举图例枚举图例 创建一个Windows窗体应用程序Ex_Hatch。在打开的窗体设计器中,单击Form1窗体,在窗体属性窗口中,将Text属性内容修改成“Hatchstyle枚举图例”。 在窗体属性窗口中,单击窗体字体属性Font右侧的 按钮,从弹出的字体对话框中选择“Arial,六号”字体,并将窗体背景颜色属性BackColor选择为“Web”页面中的“White”颜色,窗体大小属性Size设为640,510。 将窗体属性窗口切换到事件页面,为窗体添加Paint事件处理方

24、法On_Paint,并添加下列代码。private: System:Void On_Paint(System:Object sender, System:Windows:Forms:PaintEventArgs e) Graphics pGH = e-Graphics; / 获取HatchStyle所有枚举值的名称 array styleNames = Enum:GetNames( Drawing2D:HatchStyle:typeid ); / 定义图例和样式名称显示的起点 Rectangle hatchRect = Rectangle( 0, 0, 100, 20 ); hatchRect

25、.Offset( 5, 5 ); PointF pt; / 绘制图例和样式名称 for each ( String item in styleNames ) / 将item名称的样式转换成HatchStyle枚举对象 Object oItem = Enum:Parse( Drawing2D:HatchStyle:typeid, item ); / 将Object转换成HatchStyle枚举类型 Drawing2D:HatchStyle curStyle = ( Drawing2D:HatchStyle )( oItem ); / 构造一个图案画刷 Drawing2D:HatchBrush b

26、rush = gcnew Drawing2D:HatchBrush( curStyle, Color:Black, Color:LightSkyBlue); / 填充矩形 pGH-FillRectangle( brush, hatchRect ); / 绘制样式名称 pt.X = (float)hatchRect.X; pt.Y = (float)hatchRect.Bottom; pGH-DrawString( item, this-Font, Brushes:Black, pt ); hatchRect.Offset( 130, 0 ); if ( hatchRect.Right e-Cl

27、ipRectangle.Right ) hatchRect.Offset( 0, 40 ); hatchRect.X = 0; hatchRect.Offset( 5, 0 ); 编译运行,结果如图9.6所示。5.2.2 画刷Brush类3TextureBrush纹理画刷TextureBrush类提供了用保存在图像文件中的图案来填充图形的纹理画刷,其中这些图像文件可以是bmp、jpg、ico及gif等格式的文件。TextureBrush类被包含在System:Drawing命名空间中。在创建一个纹理画刷时,可以通过将已加载图像的Image对象及由WrapMode枚举指定填充图形的纹理样式传递给

28、TextureBrush类的构造函数来实现。例如:Image image = Image:FromFile(Lbackground.bmp); / 加载填充图像文件TextureBrush brush = gcnew TextureBrush(image, WrapMode:Tile); / 创建纹理画刷5.2.2 画刷Brush类枚举类型WrapMode被包含在System:Drawing:Drawing2D命名空间中,用于指定当纹理或渐变小于所填充的区域时平铺纹理或渐变的方式。WrapMode枚举中的纹理样式如表5.6所示。纹 理 样 式说 明Clamp把纹理或倾斜度固定在边界上,纹理或渐

29、变没有平铺Tile使倾斜度或纹理平铺TileFlipX水平颠倒倾斜度或纹理,然后平铺倾斜度或纹理TileFlipY垂直颠倒倾斜度或纹理,然后平铺倾斜度或纹理TileFlipXY水平和垂直颠倒倾斜度或纹理,然后平铺倾斜度或纹理画刷例如,下面的示例是通过设定纹理的图像区域和不同的平铺方式来填充区域,结果如图9.7所示。取此区域图像为画刷纹理画刷【例例Ex_Texture】使用纹理画刷使用纹理画刷创建一个Windows窗体应用程序Ex_Texture。在打开的窗体设计器中,单击Form1窗体,在窗体属性窗口中,将Text属性内容修改成“使用纹理画刷”。在窗体的属性窗口中,单击BackgroundIm

30、age属性右侧的 按钮,在打开的文件对话框中指定一个图片文件(如系统“图片收藏”“示例图片”夹中的Blue hills.jpg)。将窗体属性窗口切换到事件页面,为窗体添加Paint事件处理方法On_Paint,并添加下列代码。编译运行。 Graphics pGH= e-Graphics; Rectangle rcCirle= Rectangle( 0, 0, 100, 100); rcCirle.Offset( 20, 20 ); Image img= this-BackgroundImage; Rectangle rc1= Rectangle( 0, 0, 30, 30); rc1.Offs

31、et(0, img-Height - 50); pGH-DrawRectangle( Pens:Blue, rc1 ); / 画出取纹理图像的区域TextureBrush brush = gcnew TextureBrush( img, rc1 ); / 定义一个纹理画刷 / 按默认平捕方式填充 pGH-FillRectangle( brush, rcCirle ); pGH-DrawRectangle( Pens:Blue, rcCirle ); / 按Clamp平捕方式填充 rcCirle.Offset( 120, 0 ); brush-WrapMode = Drawing2D:WrapM

32、ode:Clamp; pGH-FillRectangle( brush, rcCirle ); pGH-DrawRectangle( Pens:Blue, rcCirle ); / 按TileFlipX平捕方式填充 rcCirle.Offset( 120, 0 ); brush-WrapMode = Drawing2D:WrapMode:TileFlipX; pGH-FillRectangle( brush, rcCirle ); pGH-DrawRectangle( Pens:Blue, rcCirle ); / 按TileFlipXY平捕方式填充 rcCirle.Offset( 120,

33、0 ); brush-WrapMode = Drawing2D:WrapMode:TileFlipXY; pGH-FillRectangle( brush, rcCirle ); pGH-DrawRectangle( Pens:Blue, rcCirle );5.2.2 画刷Brush类4LinearGradientBrush渐变画刷在创建渐变画刷对象时,除需要指定渐变的起始色和结束色外,还需要由Rectangle结构或Point结构指定渐变的范围和速度。如果实际填充的图形区域比这个范围小,则只有部分的颜色被填充到区域中;如果实际填充的图形区域比这个范围大,则渐变颜色会被重复多次以填充整个区域

34、。例如:Rectangle rect(0, 0, 100, 100); / 渐变范围LinearGradientBrush brush = gcnew LinearGradientBrush(rect, Color:Red, Color:Black, LinearGradientMode:ForwardDiagonal); / 渐变画刷画刷5. 路径渐变画刷(路径渐变画刷(PathGradientBrush)PathGradientBrush类封装了路径渐变画刷功能,它常用的构造函数如下:PathGradientBrush( GraphicsPath path);PathGradientBru

35、sh( array points);PathGradientBrush( array points, WrapMode wrapMode);【例例Ex_Gradient】使用渐变画刷使用渐变画刷 创建一个Windows窗体应用程序Ex_Gradient。在打开的窗体设计器中,单击Form1窗体,在窗体属性窗口中,将Text属性内容修改成“使用渐变画刷”。 将窗体属性窗口切换到事件页面,为窗体添加Paint事件处理方法On_Paint,并添加下列代码。 Graphics pGH = e-Graphics; double r = 50.0;/ 正六边形外接圆直径 double angle = 0.

36、0; array pt = gcnew array(6); for (int i=0; i6; i+)/ 计算六边形顶点坐标 pti.X = (int)( r * Math:Cos( angle ) + 50; pti.Y = (int)( r * Math:Sin( angle ) + 50; angle += 60.0 * Math:PI / 180.0; / 定义各个点的颜色 array colors = gcnew array(6); colors0 = Color:Red; colors1 = Color:Green; colors2 = Color:Blue; colors3 =

37、Color:AliceBlue; colors4 = Color:LightPink; colors5 = Color:Azure; / 定义并创建一个正六边形路径 Drawing2D:GraphicsPath path = gcnew Drawing2D:GraphicsPath(); path-AddLines( pt ); / 创建一个路径渐变画刷 Drawing2D:PathGradientBrush pathBrush = gcnew Drawing2D:PathGradientBrush( path ); / 或直接通过点来创建 / Drawing2D:PathGradientBr

38、ush pathBrush = / gcnew Drawing2D:PathGradientBrush( pt ); 编译运行,调整窗体大小,绘制的内容完全显示出来,结果如图9.8所示。 pathBrush-CenterPoint= Point( 30, 30 ); pathBrush-CenterColor= Color:Yellow; pathBrush-SurroundColors= colors; / 创建一个线性渐变画刷 Drawing2D:LinearGradientBrush lineBrush = gcnew Drawing2D:LinearGradientBrush( Rec

39、tangle(0,0,20,20) , Color:Red, Color:Blue, Drawing2D:LinearGradientMode:BackwardDiagonal ); Rectangle rc = Rectangle( 0, 0, 150, 100 ); rc.Offset( 50, 30 ); pGH-FillPath( pathBrush, path );/ 使用路径渐变画刷填充 pGH-FillRectangle( pathBrush, rc );/ 使用路径渐变画刷填充 pGH-DrawRectangle( Pens:Blue, rc ); rc.Offset( 180

40、, 0 ); pGH-FillRectangle( lineBrush, rc );/ 使用线性渐变画刷填充5.2.3 绘制二维图形-基本绘图方法表9.3列出了这些基本绘图方法。绘图方法绘图方法功能描述功能描述DrawArc绘制一条圆弧曲线,范围由起止角大小决定,大小由矩形或长宽值指定DrawBezier绘制一条由一系列型值顶点决定的三次Bezier曲线DrawBeziers绘制一系列的三次Bezier曲线DrawClosedCurve绘制一条封闭的样条曲线DrawCurve绘制一条样条曲线DrawEllipse绘制一条椭圆轮廓线,大小由矩形或长宽值指定DrawLine绘制一条直线DrawPa

41、th绘制由GraphicsPath定义的路径轮廓线DrawPie绘制一条扇形(饼形)轮廓线DrawPolygon绘制一个多边形的轮廓线DrawRectangle绘制一个矩形FillEllipse填充一个椭圆区域FillPath填充一个由路径指定的区域FillPie填充一个扇形(饼形)区域FillPolygon填充一个多边形区域FillRectangle填充一个矩形区域FillRectangles用同一个画刷填充一系列矩形区域FillRegion填充一个区域(Region)的内部5.2.3 绘制二维图形 1绘制直线绘制直线Graphics类的DrawLine方法用于绘制一条连接由坐标对指定的两个

42、点的线条。该方法根据传递的Pen对象及由Point结构指定的两点间绘制直线。DrawLine方法的声明如下:void DrawLine( Pen pen, Point pt1, Point pt2 );void DrawLine( Pen pen, int x1, int y1, int x2, int y2 );Pen参数表示用于绘制线条的画笔对象,在调用DrawLine方法之前应该已经被创建;pt1和pt2分别代表直线的起点和终点,而x1、y1、x2和y2分别表示由整数类型表示的起点和终点的坐标。5.2.3 绘制二维图形 2绘制基数线条绘制基数线条基数线条是平滑地通过一组给定点的曲线,由一

43、系列点和张力参数定义,即曲线平滑地通过系列中的每个点,张力参数影响曲线的弯曲方式。当绘制基数线条时,首先需要创建Graphics对象,并将一个Point结构的数组传递给DrawCurve方法。DrawCurve方法的声明如下:void DrawCurve( Pen pen, array points );void DrawCurve( Pen pen, array points, float tension );points参数是一个Point结构数组,其中包含了用于定义线条的一组顶点;tension参数指定曲线的张力参数,该参数用于表示基数线条的弯曲幅度,其取值范围在0.0F到1.0F之间,

44、若该值为0.0F时,DrawCurve方法将以直线段连接各点。5.2.3 绘制二维图形3绘制贝济埃曲线绘制贝济埃曲线 Bezier曲线是最常见的非规则曲线之一,该曲线属于三次曲线。贝济埃线条由两个端点和两个控制点定义,即该曲线不通过控制点,但是控制点影响曲线从一个端点到另一个端点时的方向和弯曲程度。通过四个点便能够绘制该曲线,其中第一和第四个点是端点,而其他两个点是控制点,如图5.2所示。Graphic类提供了DrawBezier方法来绘制贝济埃曲线,该方法的声明如下:void DrawBezier( Pen pen, Point pt1, Point pt2, Point pt3, Poin

45、t pt4 );void DrawBezier( Pen pen, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4 );5.2.3 绘制二维图形 4绘制矩形绘制矩形Graphics类的DrawRectangle方法用于绘制由坐标对、宽度和高度指定的矩形。DrawRectangle方法的声明如下:void DrawRectangle( Pen pen, Rectangle rect );void DrawRectangle( Pen pen, int x, int y, int widt

46、h, int height );参数Pen是需要使用的画笔对象,在调用DrawRectangle方法之前应该已经被创建。x和y表示矩形的左上角坐标,而width和height指定了矩形的宽度和高度。同时,还可以通过Rectangle结构来指定绘制的矩形。5.2.3 绘制二维图形 5绘制多边形绘制多边形多边形是由三个或三个以上的直边所组成的闭合图形。Graphics类中的DrawPolygon方法可以根据指定的顶点来绘制多边形。DrawPolygon方法的声明如下:void DrawPolygon( Pen pen, array points );points参数是一个Point结构的数组。数组

47、中的每一个元素都代表多边形的一个顶点,两个相邻的顶点构成一条边。若最后一个顶点与第一个顶点不一致,将把它们连成线构成最后一条边。5.2.3 绘制二维图形 6绘制圆和椭圆绘制圆和椭圆圆和椭圆都是用Graphics类的DrawEllipse方法来绘制的。传递给DrawEllipse方法的参数同样是一个矩形,而该矩形作为所画的圆或椭圆的外接矩形,并决定圆或椭圆的大小和形状。DrawEllipse方法的声明如下:void DrawEllipse( Pen pen, Rectangle rect );void DrawEllipse( Pen pen, int x, int y, int width,

48、int height );5.2.3 绘制二维图形 7绘制弧线绘制弧线弧线是圆或椭圆的圆周的一部分,可以通过Graphics类的DrawArc方法来绘制。DrawArc方法的参数同样需要指定一个圆或椭圆的外接矩形,另外还需要指定起始角和扫描角。DrawArc方法的声明如下:void DrawArc( Pen pen, Rectangle rect, float startAngle, float sweepAngle );void DrawArc( Pen pen, int x, int y, int width, int height, int startAngle, int sweepAn

49、gle );void DrawArc( Pen pen, float x, float y, float width, float height, float startAngle, float sweepAngle );5.2.3 绘制二维图形起始角startAngle指定了弧线的起始角度,该角度的度量是以圆或椭圆向右的半径为0度,按顺时针方向增加。而扫描角sweepAngle表示从起始角开始,按顺时针方向增加的角度。起始角和扫描角的值都可以是正值(顺时针),也可以是负值(逆时针)。如图5.3所示。5.2.3 绘制二维图形8绘制饼形图绘制饼形图饼形图也称为扇形图,它是圆或椭圆的一部分,但与弧

50、线不同,饼图是由弧和连接弧线两个端点的半径组成。饼形图通过Graphics对象的DrawPie方法画制,它的使用方法与DrawArc方法完全相同,如图5.3所示。DrawPie方法的声明如下:void DrawPie( Pen pen, Rectangle rect, float startAngle, float sweepAngle );void DrawPie( Pen pen, int x, int y, int width, int height, int startAngle, int sweepAngle );void DrawPie( Pen pen, float x, flo

51、at y, float width, float height, float startAngle, float sweepAngle );5.2.4 绘图和填充示例下面通过一个示例来了解使用Graphics对象绘制、填充图形的一般方法。该示例将在窗体中绘制一个饼形图,用来表示一个班级某门课程的成绩分布。在饼形图中根据成绩划分为五个部分,分别表示60分以下、6069分、7079分、8089分和90分以上分数段的人数比例,如图5.4所示。5.2.4 绘图和填充示例【例5.1】 绘制课程的成绩分布图。(1)创建一个项目名称为Ex5_1的Windows窗体应用程序项目,适当调整窗体的大小,并修改窗体

52、的Text属性为“成绩分布图”。(2)为Form1类添加一个成员方法DrawScore,其中分别包含一个Graphics对象和double类型数组对象的参数。然后在该方法中统计各个分数段的人数,并分别绘制直方图、曲线图和饼形图。代码如下。System:Void DrawScore(System:Drawing:Graphics g, array score) array scoreNum = gcnew array(5)0; for each (double s in score) if (s = 90) scoreNum0+; / 统计各分数段的人数 else if (s = 80) sco

53、reNum1+; else if (s = 70) scoreNum2+; else if (s = 60) scoreNum3+; else scoreNum4+; / 小于60分的人数 FontFamily fontFamily = gcnew FontFamily(L宋体); / 宋体字体 Drawing:Font font = gcnew Drawing:Font(fontFamily, 10, FontStyle:Regular); SolidBrush brush1 = gcnew SolidBrush(Color:Black);/* 绘制直角坐标系的两条坐标线及文字 */ Pen

54、 pen1 = gcnew Pen(Color:Black); pen1-EndCap = LineCap:ArrowAnchor; / 末端带箭头 g-DrawLine(pen1, 20, 200, 20, 20); / 垂直线 g-DrawLine(pen1, 20, 200, 320, 200); / 水平线 g-DrawString(L人数, font, brush1, 20, 20); g-DrawString(LDrawString(L60-70, font, brush1, 90, 210); g-DrawString(L70-80, font, brush1, 140, 210

55、); g-DrawString(L80-90, font, brush1, 190, 210); g-DrawString(L=90, font, brush1, 240, 210); g-DrawString(L分数段, font, brush1, 280, 210); array points = gcnew array Point( 60, 240-15*scoreNum4), Point(110, 240-15*scoreNum3), Point(160, 240-15*scoreNum2), Point(210, 240-15*scoreNum1), Point(260, 240-1

56、5*scoreNum0) ; array brushes = gcnew array gcnew HatchBrush(HatchStyle:LightVertical, Color:Red, Color:Gray), gcnew HatchBrush(HatchStyle:LightDownwardDiagonal, Color:Yellow, Color:Blue), gcnew HatchBrush(HatchStyle:LightHorizontal, Color:White, Color:Green), gcnew HatchBrush(HatchStyle:LightUpwardD

57、iagonal, Color:Yellow, Color:Orange), gcnew HatchBrush(HatchStyle:OutlinedDiamond, Color:Blue, Color:Red), ; /* 直方图 */ for (int i=4; i=0; i-) g-FillRectangle(brushesi, pointsi.X-25, pointsi.Y, 50, 200-pointsi.Y); g-DrawString(scoreNumi+L人, font, brush1, pointsi.X-10, pointsi.Y-15); /* 曲线图 */ Pen pen

58、2 = gcnew Pen(Color:Blue, 2); g-DrawCurve(pen2, points); / 基数曲线 /* 饼形图 */ float startAngle = 0.0f, sweepAngle = 0.0f; for (int i=4; i=0; i-) startAngle = startAngle + sweepAngle; / 起始角度 sweepAngle = (float)scoreNumi*360/score-Length; / 扫描角度 g-FillPie(brushesi, Rectangle(340, 40, 180, 180), startAngl

59、e, sweepAngle); 5.2.4 绘图和填充示例(3)在“属性”窗口中为Form1窗体添加Paint事件的处理方法,并在该方法定义一个包含一组成绩值的数组,调用DrawScore方法绘制成绩分布图。代码如下:System:Void Form1Paint(System:Object sender, System:Windows:Forms:PaintEventArgs e) array score = gcnew array / 40个成绩值 66,82,79,74,86,67,60,45,44,77, 98,65,90,66,76,66,62,83,84,97, 43,67,57,6

60、0,60,71,74,60,72,81, 69,79,91,69,71,42,82,77,69,81, ; DrawScore(e-Graphics, score); / 绘制成绩分布图(4)选择“生成”“生成解决方案”菜单命令以生成项目,并选择“调试”“开始执行(不调试)”菜单命令运行项目。Ex5_1项目的运行结果如图5.4所示。9.2.5 基本绘图方法下面来看一个示例,如图9.9所示。该示例是根据用户用鼠标指定的一组点来画出连续折线、封闭多边形和样条曲线。 9.2.5 基本绘图方法【例例Ex_Curve】绘图示例绘图示例 创建一个Windows窗体应用程序Ex_Curve。在打开的窗体设计

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论