C#图形程序设计基础 1 GDI+绘图基础 2 基本图形的绘制 3 实用图形程序设计.

Slides:



Advertisements
Similar presentations
計算機程式及實習 Computer Program Design and Experiment) 期末報告 ppt 南台科技大學機械工程系 姓名 : 蔡中銘 學號 :4A 授課老師 : 謝慶存大帥哥.
Advertisements

視窗應用程式表單的基本輸出入 資管系 助理教授 詹曉苓.
项目7 面向对象高级.
計算機程式及實習 期末報告 題目:商店結帳系統
多樂一甲 謝佩臻 4A3K0009.
第10章 处理图形 Visual Basic 程序设计教程.
人 工 智 慧 報 告 五子棋AI設計 報告者 : 潘輝銘.
Java程序设计教程 第一讲 Java概述.
Hello小程序的运行和编译 Java AppletJava小程序的构成 1、关键字
第7章 C#函數與.NET Framework類別函數庫
项目:贪吃蛇游戏设计 工作任务一:系统设计(system design) 工作任务二:豆类(Bean)设计
Adobe Illustrator Speaker:林昱志.
第五单元课1-3 层叠样式表.
CH09.
14 繪圖與動畫 [我的小畫家][打磚塊遊戲] 14-1 繪圖的基礎 14-2 滑鼠事件與基本繪圖 14-3 在Bitmap物件繪圖
第十八章 图形和多媒体.
第13章多项目设计与开发.
6.1VB.net概述 6.2初学者工具包 6.3图形图像处理 6.4声音及视频处理
项目:贪吃蛇游戏设计 工作任务三:块类(Block)设计 工作任务四:蛇类(Snake)设计
類別與物件 Class & Object.
第5章 Java中类、对象、接口 及包的概念 5.1 类的基本概念 5.2 类的继承概念 5.3 抽象类和接口 5.4 包.
第 11 章 繪圖與多媒體.
第5章 面向对象程序设计 本章要点 5.1 面向对象程序设计概述 5.2 Java语言的面向对象程序设计 5.3 方法的使用和对象数组
第二章 C# 基础知识.
第13章 WinForms基础知识.
Ch07 Java Applets 物件導向系統實務.
Classes Lecturer: 曾學文.
项目五 窗体上绘图 任务列表: 1、在窗体上绘制各种基本图形 2、在窗体上绘制文本.
第9章 Windows窗体应用程序设计 9.1 窗体设计 9.2 常用的控件设计 9.3 多个窗体之间的数据传递 9.4 多文档窗体
Windows 程式設計 (使用 C++ / C#)
Visual Basic程序设计 第八章 过程 -子程序和函数
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
C#程序设计 c# programming GDI+绘图 C#程序设计课程组.
Java程序设计 第9章 继承和多态.
第五章 Windows窗体界面设计 5.1 鼠标事件与键盘事件 5.2 Windows窗体基本控件 5.3 菜单与工具栏
2D / 3D 遊戲程式設計入門 使用 XNA 3.0 與 C# 2D圖形與字型的呈現.
form1 卡拉OK pictureBox1 fish1.bmp pictureBox2 fish2.bmp label1 卡拉OK字幕機
中国矿大计算机学院杨东平 第5章 接口和包 中国矿大计算机学院杨东平
第6章 继承和接口设计 6.1 继 承 6.2 多态性 6.3 抽象类 6.4 接口 6.5 接口在集合排序中的应用.
2D / 3D 遊戲程式設計入門 使用 XNA 3.0 與 C# 第五章 頂點定義與基本形狀的繪出.
第5章 .NET框架类 5.
視窗程式設計 (Windows Programming)
Windows Form绘图类及其简介.
第12章 繪圖與多媒體 12-1 繪圖的基礎 12-2 繪出文字和圖形 12-3 載入與顯示圖形檔案 12-4 建立多媒體的動畫效果
CSS樣式 靜宜大學 資管系 楊子青.
平面繪圖與動畫.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C#程序设计基础 第二章 数据类型.
資訊學科中心研習 JAVA程式設計專題 臺北市立大理高級中學 黃世隆 2019/2/23.
P2P聊天工具.
第4章 視窗應用程式的基本輸出入 4-1 物件基礎程式設計 4-2 表單控制項 4-3 按鈕控制項 4-4 資料輸出的標籤控制項
題目:南台飲料店結帳系統 南台科技大學 機械工程系 車輛一甲 學號:4A
第6章 GDI+编程 GDI+ 已完全替代 GDI,以图形图像作为对象,可在 Windows 窗体应用程序中以编程方式绘制或操作图形图像。虽然无法对 Web 窗体直接使用 GDI+,但可以通过 Web 服务器的“图像”(Image) 控件显示图形图像。 处理图像图形包括创建 Graphics 对象,使用.
劉崇汎 崑山科技大學 電腦與通訊系 DLL的建立與引用 劉崇汎 崑山科技大學 電腦與通訊系
計算機程式及實習 Computer Program Design and Experiment) 期末報告ppt製作 南台科技大學 機械工程系 題目:南台電影城結帳系統 班級 : 車輛一甲 學號 : 4A 授教學生: 阮偉倫 授課老師: 謝慶存.
补充:c#语言基础.
C#程序设计基础 $3 成员、变量和常量.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
Interfaces and Packages
林福宗 清华大学 计算机科学与技术系 2008年9月 2019年5月5日 多媒体技术教程 第4章 彩色数字图像基础 林福宗 清华大学 计算机科学与技术系 2008年9月.
Object-Oriented Programming in C++ 第二章 类和对象
坐標幾何的基本概念 Title page: Font size 36, bold, theme color of the chapter (red for geometry, blue for algebra, green for statistics)
Print方法和函数 2019/5/19.
MDI介面建置 建國科技大學 資管系 饒瑞佶.
Java语言程序设计 清华大学出版社 第6章 java图形与图像处理.
C# 匿名委派 + Lambda + Func 建國科技大學 資管系 饒瑞佶.
Applet.
C#快速導讀 流程控制.
Presentation transcript:

C#图形程序设计基础 1 GDI+绘图基础 2 基本图形的绘制 3 实用图形程序设计

1 GDI+绘图基础 1.1 图形设备接口 GDI+:Graphics Device Interface Plus,它提供了各种丰富的图形图像处理功能 在C#.NET中,使用GDI+处理二维(2D)的图形和图像,使用DirectX处理三维(3D)的图形图像 GDI+主要有二维矢量图形、图像处理和版式三部分组成 GDI+提供了存储基元自身相关信息的类和结构、存储基元绘制方式相关信息的类,以及实际进行绘制的类 GDI+ 为使用各种字体、字号和样式来显示文本这种复杂任务提供了大量的支持 其他高级功能

图形图像处理中常常调用的名称空间: System:包括常用基础数据类型和24个子名称空间 System.Drawing:提供了对GDI+基本图形功能的访问,主要有Graphics类、Bitmap类、从Brush类继承的类、Font类、Icon类、Image类、Pen类、Color类等 System.Drawing.Drawing2D:提供了高级的二维和矢量图形功能。主要有梯度型画刷、Matrix类(用于定义几何变换)和GraphicsPath类等 System.Drawing.Imaging:提供了高级 GDI+ 图像处理功能 System.WinForms:提供许多与数据处理相关的结构的类 System.Timers:提供精确的计时操作 System.Drawing.Text:提供了高级 GDI+ 字体和文本排版功能

1.2 创建Graphics对象 Graphics类包含在System.Drawing名称空间下。要进行图形处理,必须首先创建Graphics对象,然后才能利用它进行各种画图操作,即先创建Graphics对象再使用该对象的方法绘图、显示文本或处理图像。 创建Graphics对象的形式有: 1.在窗体或控件的Paint事件中直接引用Graphics对象 每一个窗体或控件都有一个Paint事件,该事件的参数中包 含了当前窗体或控件的Graphics对象,在为窗体或控件创建绘 制代码时,一般使用此方法来获取对图形对象的引用: Private void Form_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { Graphics g = e.Graphics; …… }

2.利用窗体或某个控件的CreateGraphics方法 注意这种对象只有在处理当前Windows窗口消息的过程中有效;如果想在已存在的窗体或控件上绘图,可以使用此方法。 例如: Graphics g=this.CreatGraphics(); 3.从继承自图像的任何对象创建Graphics对象 此方法在需要更改已存在的图像时十分有用,例如: Bitmap bitmap = new Bitmap(@”C:\test\a1.bmp”); Graphics g = Graphics.FromImage( bitmap );

在图形图像处理程序设计中,与Graphics对象一起使用的用户对象常有: Pen:用于绘制线条、勾勒形状轮廓等; Brush:用于填充图形区域; Font:提供有关在呈现文本时要使用什么形状的说明; Color:该结构表示要显示的不同颜色 注意:由于图像对象非常占资源,所以在不用这些对象时要用Dispose方法及时释放资源

附: 颜色 颜色是进行图形操作的基本要素。任何一种颜色都可以由四个分量决定,每个分量占据一个字节: R:红色,取值范围0~255,255为饱和红色 G:绿色,取值范围0~255,255为饱和绿色 B:蓝色,取值范围0~255,255为饱和蓝色 A:Alpha值,即透明度。取值范围0~255,0为完全透明,255为完全不透明 在System.Drawing名称空间下,有一个Color结构类型,包含系统已定义的颜色种类。 可以使用下列方法创建颜色对象: ⑴ 使用FromArgb指定任意颜色 这个方法有两种常用的形式:

public static Color FromArgb( int red, int green, int blue ) 第一种形式是直接指定三种颜色,方法原型为: 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.FromArgb( 0, 255, 0); Color blue = Color.FromArgb( 0, 0, 0xff); 其中,0xff为十六进制表示形式。 第二种形式使用四个参数,格式为: 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.LightGoldenrodYellow;

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 myPen = new Pen( myBrush); Pen myPen = new Pen( myBrush, 5 );

2.Pen对象的属性: 画笔对象的属性用于返回或设置画笔对象的颜色、画线样式、画线始点及终点的样式等。常用属性如下: Color: DashCap: DashStyle: EndCap: PenType: StartCap: Width: 例:

using System.Drawing.Drawing2D; 1) 新建一个Windows应用程序,适当加宽窗体宽度。然后切换到代码方式,添加名称空间引用: using System.Drawing.Drawing2D; 2) 添加Form1_Paint事件代码。 private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs 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(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.NoAnchor; g.DrawString( "自定义虚线", this.Font, new SolidBrush(Color.Black), 5, 65 ); g.DrawLine( pen, new Point(110,70), 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)); }

运行结果

1.4 创建画刷 画刷是可与Graphics对象一起使用来创建实心形状和呈现文本的对象。可以用画刷填充各种图形形状,如矩形、椭圆、扇形、多边形和封闭路径等。 几种不同类型的画刷: SolidBrush:画刷最简单的形式,用纯色进行绘制 HatchBrush:类似于 SolidBrush,但是可以利用该类从大量预设的图案中选择绘制时要使用的图案,而不是纯色 TextureBrush:使用纹理(如图像)进行绘制 LinearGradientBrush:使用沿渐变混合的两种颜色进行绘制 PathGradientBrush :基于编程者定义的唯一路径,使用复杂的混合色渐变进行绘制

(1)使用SolidBrush类定义单色画笔 SolidBrush类用于定义单色画笔。该类只有一个构造函 数,带有一个Color类型的参数。 下面的示例说明如何在窗体上绘制一个纯红色的椭圆。 该椭圆将符合为其提供的矩形的大小(此例中为表示整个 窗体的ClientRectangle)。 例: private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { Graphics g = e.Graphics; SolidBrush myBrush = new SolidBrush( Color.Red ); g.FillEllipse( myBrush, this.ClientRectangle ); }

运行效果

(2)使用HatchBrush类绘制简单图案 HatchBrush类用于从大量预设的图案中选择绘制时要使用 的图案,而不是纯色。 阴影,前景色与背景色的比例为90:100,并使用白色作为前 景色,黑色作为背景色。 例: private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { Graphics g = e.Graphics; HatchBrush aHatchBrush = new HatchBrush( HatchStyle.Percent90, Color.White, Color.Black); g.FillEllipse( aHatchBrush, this.ClientRectangle ); }

运行效果:

(3)使用TextureBrush类绘制复杂图案 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:用于指定图像上用于画笔的矩形区域,其位置不能超 越图像的范围。 WrapMode:WrapMode枚举成员用于指定如何排布图像,可以是 Clamp 完全由绘制对象的边框决定 Tile 平铺 TileFlipX 水平方向翻转并平铺图像 TileFlipY 垂直方向翻转并平铺图像 TileFlipXY 水平和垂直方向翻转并平铺图像

用名为m23.jpg的图像进行绘制。 例: ImageAttributes:用于指定图像的附加特性参数。 TextureBrush类有三个属性: Image:Image类型,与画笔关联的图像对象。 Transform:Matrix类型,画笔的变换矩阵。 WrapMode:WrapMode枚举成员,指定图像的排布方式。 下面的示例说明了如何创建一个TextureBrush,例子使 用名为m23.jpg的图像进行绘制。 例: private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { Graphics g = e.Graphics; TextureBrush myBrush = new TextureBrush(new Bitmap(@"e:\test\m23.jpg")); g.FillEllipse( myBrush, this.ClientRectangle ); }

运行效果:

(4)使用LinearGradientBrush类定义线性渐变 这个类用于定义线性渐变画笔,可以是双色渐变,也可 以是多色渐变。缺省情况下,渐变由起始颜色沿着水平方 向平均过渡到终止颜色。要定义多色渐变,需要使用 InterpolationColors属性。下面的示例说明如何由白色渐 变到蓝色。 例: private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { Graphics g = e.Graphics; LinearGradientBrush myBrush = new LinearGradientBrush( this.ClientRectangle, Color.White, Color.Blue, LinearGradientMode.Vertical ); g.FillRectangle( myBrush, this.ClientRectangle ); }

如果创建应用程序后向设计窗体上拖放一些控件,可以看到运行后该图就是一个漂亮的背景了。

(5)使用PathGradientBrush类实现彩色渐变 在GDI+中,把一个或多个图形组成的形体称作路径。可以 使用GraphicsPath类定义路径,使用PathGradientBrush类定 义路径内部的渐变色画笔。渐变色从路径内部的中心点逐渐过 渡到路径的外边界边缘。 PathGradientBrush类有三种形式的构造函数,形式之一是: public PathGradientBrush( GraphicsPath path ) 其中,GraphicsPath定义画笔填充的区域。 例,路径和路径画笔的使用: using System.Drawing.Drawing2D; ……

private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs 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.CenterPoint=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); 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,path); }

在这个例子中,可以看到当使用FillPath()方法填充路径的时候,如果多个图形互相重叠,则重叠部分的数目为偶数时不会被填充,因此右图中间部分仍为背景色而不是蓝色。

附:平移、旋转与缩放 Graphics类提供了三种对图像进行几何变换的方法,它们 是TranslateTransform()方法、RotateTransform()方法和 ScaleTransform()方法,分别用于图形图像的平移、旋转和 缩放(以坐标系原点为中心)。 TranslateTransform( )方法的形式为: public void TranslateTransform(float dx,float dy) 其中,dx表示平移的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, System.Windows.Forms.PaintEventArgs e) { Graphics g = e.Graphics; g.FillEllipse(new SolidBrush(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)), g.ScaleTransform(0.5f,0.5f); //缩小到一半 g.FillEllipse(new SolidBrush(Color.FromArgb(100, Color.Red)), }

2 基本图形的绘制 1. 画点 C#采用Point结构和SetPixel()方法完成画点的功能;其中Point用于图形设计,SetPixel()用于图像处理 Point原型: public struct Point; 使用: public Point p1 = new Point(); 每个点结构有x和y两个属性,表示横纵坐标,如: p1.x = 30; p1.y = 100;

如:Graphics g = this.CreateGraphics( ); 2. 画直线 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) DrawLines方法 public void DrawLines( Pen pen, Point[ ] pts );

效果 private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs 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); } 效果

其中x, y为椭圆外接矩形左上角的坐标,width定义椭圆 3. 画椭圆 1) public void DrawEllipse(Pen pen, int x, int y, int width, int height) 其中x, y为椭圆外接矩形左上角的坐标,width定义椭圆 的外接矩形的宽度,height定义椭圆外接矩形的高度。 2) public void DrawEllipse(Pen pen, Rectangle rect) 其中rect为Rectangle结构,用于确定椭圆的外接矩形。

的外接矩形的宽度,height定义椭圆外接矩形的高度。例: 4. 绘制圆弧 public void DrawArc( Pen pen, int x, int y, int width, int height, int startAngle, int sweepAngle ) 其中x, y为椭圆外接矩形左上角的坐标,width定义椭圆。 startAngle圆弧起点, sweepAngle顺时针画过的角度 的外接矩形的宽度,height定义椭圆外接矩形的高度。例: Graphics g = this.CreateGraphics( ); Pen pen = new Pen(Color.Red, 2 ); g.Clear(this.BackColor); g.DrawArc(pen,0,0,200,300,-60,180);

5. DrawPie(扇形) 各参数意义: 例: Graphics g = this.CreateGraphics( ); public 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,160,200);

6. 画矩形 参数含意: 2) public void DrawRectangle(Pen pen, Rectangle rect) 例: 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, System.Windows.Forms.PaintEventArgs e) { Graphics g = e.Graphics; Pen pen = new Pen( Color.Black, 3); Rectangle rect = new Rectangle( 30, 30, 200, 100); e.Graphics.DrawRectangle( pen, rect ); }

3)public void DrawRectangles( Pen pen, Rectangle[] rects ) 该方法用于绘制多个矩形。 例: private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs 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) }; e.Graphics.DrawRectangles( pen, rects ); }

其中points是Point结构的数组,第一段贝塞尔曲线从点数组 7. Bezier 每段贝塞尔曲线都需要四个点,第一个点是起始点,第四个点 是终止点,第二个点和第三个点控制曲线的形状。使用 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, Point[ ] points ) 其中points是Point结构的数组,第一段贝塞尔曲线从点数组 中的第一个点到第四个点绘制而成。以后每段曲线只需要三个 点:两个控制点和一个结束点。前一段曲线的结束点会自动用 作后一段曲线的起始点。

例: private void Form1_Paint( object sender, System.Windows.Forms.PaintEventArgs 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), new Point(300, 290), new Point(350,100) }; e.Graphics.DrawBeziers( blackPen, bezierPoints ); }

8. DrawPolygon(多边形) 其中:PointF表示在二维平面中定义点的、浮点 x 和 y 坐标的有序对 例:画一个四边形 public 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.CreateGraphics( ); 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 DrawClosedCurve( 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 Point( 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参数代表曲线弯曲的强度。 例: 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_Paint(object sender, System.Windows.Forms.PaintEventArgs 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(greenPen, curvePoints); }

public void DrawPath( Pen pen, GraphicsPath path ); 路径通过组合直线、矩形和简单的曲线形成的,可通过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, 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 FillEllipse( 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, int 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 该方法用于画一个填充饼图,常用格式有: 参数意义: 例: 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 ); }

3 实用图形程序设计 3.1 设计内容--简单绘图板 设计一个简单绘图板,功能类似Windows画图工具。 功能有: 能由鼠标控制绘制直线、矩形、椭圆,曲线,并能控制线条的颜色。

3.2 设计过程 3.2.1 程序界面设计 3.2.2 绘制直线 在Form中拖入pictureBox和button控件,并进行合理布局。 A.直接绘制直线 在“直线”按钮Click事件中输入代码: Point p1 = new Point(10,10); Point p2 = new Point(50,50); Graphics g = this.pictureBox1.CreateGraphics(); Pen pen = new Pen(Color.Black,1); g.DrawLine(pen,p1,p2);

B.鼠标控制绘制直线 1. “直线”起点坐标获取:在控件pictureBox1中按下鼠标左键获取起点p1(X,Y), 在pictureBox1_MouseDown事件中输入代码: Point p1 = Point.Empty, p2 = Point.Empty; p1.X = e.X; p1.Y = e.Y; p2.X = 100; p2.Y = 100; Graphics g = this.pictureBox1.CreateGraphics(); Pen pen = new Pen(Color.Black,1); g.DrawLine(pen,p1,p2);

2.“直线”终点坐标获取:在控件pictureBox1中松开鼠标左键获取终点p2(X,Y), 在pictureBox1_MouseUp事件中输入代码: Point p1 = Point.Empty, p2 = Point.Empty; p1.X = 100; p1.Y = 100; p2.X = e.X; p2.Y = e.Y; Graphics g = this.pictureBox1.CreateGraphics(); Pen pen = new Pen(Color.Black,1); g.DrawLine(pen,p1,p2); 3. 对程序进行调整,使直线的起点和终点都从光标获取。 private void pictureBox1_MouseDown() { p1.X = e.X; p1.Y = e.Y;} private void pictureBox1_MouseUp() { p2.X = e.X; p2.Y = e.Y; }

4.直线起点确定后,在pictureBox1控件中移动鼠标时,使直线可见, 在pictureBox1_MouseMove事件中输入代码: 先设置全局bool变量MouseDown,表示鼠标左键是否按下。 if(MouseDown) { Graphics g = this.pictureBox1.CreateGraphics(); Pen pen = new Pen(Color.White,1); g.DrawLine(pen,p1,p2); //清除前一根直线 p2.X = e.X; p2.Y = e.Y; pen = new Pen(Color.Black,1); g.DrawLine(pen,p1,p2); g.Dispose(); }

5. 移动鼠标时,为了原有直线不被清除, 在MouseMove事件重画原有的图形,那么必须先在MouseUp事件中保存每个已画的图形特征。 先设置全局动态数组和结构。 ArrayList addArray = new ArrayList(); public struct SharpType { public string type; //图形形状 public Point p1, p2; public Color foreColor; //画笔颜色 public SharpType(string type, Point p1, Point p2, Color foreColor) this.type = type; this.p1 = p1; this.p2 = p2; this.foreColor = foreColor; }

Mouse MouseUp事件中加入代码: addArray.Add(new SharpType("DrawLine",p1,p2,Color.Black)); MouseMove事件中加入代码: foreach( SharpType type in addArray ) { if(type.type=="DrawLine") g.DrawLine(new Pen(type.foreColor,1),type.p1,type.p2); }

foreach( SharpType type in addArray ) 6.当移动窗体或被其他窗体遮住后再次显示时,为了使原有直线不被清除, 在Paint事件重画原有的图形,Paint事件中代码如下: foreach( SharpType type in addArray ) { if(type.type=="DrawLine") e.Graphics.DrawLine(new Pen(type.foreColor,1),type.p1,type.p2); }

先设置全局变量color,对画笔中的颜色设置代码作相应的修改,把Color.Black 改为color。 7.通过对话框设置颜色, 在“选择颜色”按钮事件中加入代码如下: 先设置全局变量color,对画笔中的颜色设置代码作相应的修改,把Color.Black 改为color。 ColorDialog ColorDialog1 = new ColorDialog ( ) ; if ( ColorDialog1.ShowDialog ( ) != DialogResult.Cancel ) { this.color = ColorDialog1.Color ; }