C#程序设计 c# programming GDI+绘图 C#程序设计课程组
教学内容 GDI+概述 绘图实例
GDI+概述
什么是GDI+? 想一下,如果同学们要进行绘画,你要准备什么工作? 怎么样开始绘画呢?
GDI+的基本概念 GDI:即Graphics Device Interface,图形设备接口 GDI+是Microsoft的新一代的二维图形系统,它完全面向对象,可在Windows窗体应用程序中以编程方式绘制或操作图形图像。
System.Drawing.Imaging GDI+的命名空间 .NET框架命名空间 System.Drawing System.Drawing2D System.Drawing.Imaging System.Drawing.Text 提供了对GDI+基本图形功能的访问,对于进行一般的图形绘制来说足够了! 提供高级的二维和矢量图形功能。 提供高级GDI+图像处理功能。 提供GDI+高级排版功能。该命名空间允许用户使用多种字体,
GDI+结构?
Graphics对象 Graphics类是核心,创建的Graphics对象相当于一张画布。 一般,图形设计过程分为两步:
创建Graphics对象的方法 A 利用窗体或控件的Paint事件的参数PaintEventArgs private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e){ Graphics g=e.Graphics; } B(一般使用)使用窗体或控件的CreateGraphics方法,用于对象已经存在的情况下: Graphics g; g=this.CreateGraphics(); C 使用Image类的派生类创建Graphics对象,用于在C#中对图像进行处理的场合: Bitmap b=new Bitmap("ddd.bmp"); Graphics g=Graphics.FromImage(b);
Pen对象 Pen 对象又称为画笔对象。 用途:绘制线条、多边形、曲线等几何图形。 Pen 对象的主要属性:宽度、样式、颜色 Pen p1=new Pen(Color);//创建某一颜色的Pen 对象 Pen p2=new Pen(Brush);//创建某一刷子样式的Pen 对象 Pen p3=new Pen(Brush,float);//创建某一刷子样式并具有相应宽度的的Pen 对象 Pen p4=new Pen(Color,float);//创建某一颜色和相应宽度的Pen 对象
Brush对象(画刷) 作用:一般用来填充图形。 Brush类是一个抽象类,不能实例化,只能使用它的派生类 SolidBrush(单色画刷) (包含在命名空间System.Drawing中)、 HatchBrush(阴影画刷)、 LinearGradientBrush(颜色渐变画刷)、 PathGradientBrush(使用路径及复杂的混色渐变画刷)、 TextureBrush(纹理画刷)
Font对象 Font对象建立不同的字体。 Font对象的常用属性如下:Bold、Italic、Regular、Strikeout、Underline等等。 Graphics g=this.CreateGraphics(); Font fi=new Font("Tahoma",20,FontStyle.Bold|FontStyle.Italic); g.DrawString("GDI+编程世界",fi,new SolidBrush(Color.Blue),14,10);
常用图形的绘制 1、画直线 使用Graphics类的DrawLine方法,格式为: DrawLine(画笔,x1,y1,x2,y2) Graphics g=this.CreateGraphics();//生成图形对象 Pen Mypen=new Pen(Color.Blue ,5);//生成画笔,蓝色,5个像素 g.DrawLine(Mypen,1,1,30,30);//画线 Point pt1=new Point(1,30);//生成起点 Point pt2=new Point(30,1);//生成终点 g.DrawLine(Mypen,pt1,pt2);//画线
使用Graphics类的DrawEllipse方法,格式为: A、DrawEllipse (画笔,矩形结构数据) 2、画椭圆 使用Graphics类的DrawEllipse方法,格式为: A、DrawEllipse (画笔,矩形结构数据) 功能:绘制一个边界由矩形结构数据定义的椭圆。 B、DrawEllipse (画笔,x,y,width,height) 功能:绘制一个由边框定义的椭圆。 Graphics g=this.CreateGraphics();//生成图形对象 Pen Mypen=new Pen(Color.Blue ,5);//生成画笔,蓝色,5个像素 g.DrawEllipse(Mypen,1,1,80,40);//画椭圆 Rectangle rect=new Rectangle(85,1,165,40);//生成矩形 g.DrawEllipse (Mypen,rect);//画椭圆
使用Graphics类的DrawArc方法,格式为: A、DrawArc (画笔,矩形结构数据,实数,实数) 3、画圆弧 使用Graphics类的DrawArc方法,格式为: A、DrawArc (画笔,矩形结构数据,实数,实数) 功能:绘制由指定矩形的内接椭圆的一段圆弧。 B、DrawArc (画笔,x,y,width,height,整数,整数) 功能:绘制一段弧线,该弧线由一对坐标、宽度、高度指定椭圆的一段圆弧。 Graphics g=this.CreateGraphics();//生成图形对象 Pen Mypen=new Pen(Color.Blue ,5);//生成画笔,蓝色,5个像素 g.DrawArc(Mypen,1,1,80,40,90,270);//画弧线 Rectangle rect=new Rectangle(85,1,165,40);//生成起点 生成矩形结构 g.DrawArc (Mypen,rect,0,90);//画弧线
使用Graphics类的DrawPie方法,格式与DrawArc基本相同 4、画扇形图 使用Graphics类的DrawPie方法,格式与DrawArc基本相同 Graphics g=this.CreateGraphics();//生成图形对象 Pen Mypen=new Pen(Color.Blue ,5);//生成画笔,蓝色,5个像素 g.DrawPie(Mypen,1,1,80,40,90,270);//画扇形 Rectangle rect=new Rectangle(85,1,165,40);//生成矩形 g.DrawPie (Mypen,rect,0,90);//画扇形
使用Graphics类的DrawRectangle方法,格式为: A、DrawRectangle (画笔,矩形结构数据) 5、画矩形 使用Graphics类的DrawRectangle方法,格式为: A、DrawRectangle (画笔,矩形结构数据) 功能:绘制一个边界由矩形结构数据定义的矩形。 B、DrawRectangle (画笔,x,y,width,height) 功能:绘制一个由左上角坐标、宽度、高度定义的矩形 Graphics g=this.CreateGraphics();//生成图形对象 Pen Mypen=new Pen(Color.Blue ,2);//生成画笔,蓝色,2个像素 g.DrawRectangle (Mypen,5,5,80,40);//画矩形 Rectangle rect=new Rectangle(85,15,140,50);//生成矩形 g.DrawRectangle (Mypen,rect);//画矩形
使用Graphics类的DrawPolygon方法,格式为: A、DrawPolygon (画笔,Point[] points) 6、画多边形 使用Graphics类的DrawPolygon方法,格式为: A、DrawPolygon (画笔,Point[] points) 功能:绘制由一组Point结构定义的多边形。 B、DrawPolygon (画笔,PointF[] points) 功能:绘制由一组PointF结构定义的多边形 Point 结构只能取整数,PointF可以取实数 Pen blackPen = new Pen(Color.Black, 3);//生成画笔; Graphics g=this.CreateGraphics();//生成图形对象 Point point1 = new Point( 50, 50);//生成5个点 Point point2 = new Point(70, 25);Point point3 = new Point(100, 30); Point point4 = new Point(120, 85);Point point5 = new Point(80, 100); Point[] curvePoints ={point1,point2,point3,point4,point5}; //定义Point结构的数组 g.DrawPolygon(blackPen, curvePoints);//绘制多边形
使用Graphics类的DrawClosedCurve方法,格式为: 7、绘制闭合曲线 使用Graphics类的DrawClosedCurve方法,格式为: A、 DrawClosedCurve (画笔,Point[] points) 功能:绘制由一组Point结构定义的闭合曲线。默认张力为0.5 B、 DrawClosedCurve (画笔,Point[] points,float s,FillMode F) 功能:使用指定张力绘制由一组Point结构定义的闭合基数样条 s为指定曲线的张力,F为填充曲线的方式 Graphics g=this.CreateGraphics(); Pen p=new Pen(Color.Black,3); Point p1=new Point(50,50); Point p2=new Point(70,25); Point p3=new Point(100,30); Point p4=new Point(120,85); Point p5=new Point(80,100); Point[] ps={p1,p2,p3,p4,p5}; g.DrawClosedCurve(p,ps,0.9F,FillMode.Alternate);
典型实例
GDI+制作电子石英钟
建立画布 设置画笔 绘制中心点 绘制表盘 分别绘制3,6,9,12点 绘制时针、分针、秒针 使用TIMER控件设置动画
建立画布 Graphics g; g = this.CreateGraphics(); Pen hPen = new Pen(Color.Red, 4); //定义用来绘制小时的Pen Pen mPen = new Pen(Color.Green, 2); //定义用来绘制分钟的Pen Pen sPen = new Pen(Color.Black, 1); //定义用来绘制秒钟的Pen 建立画笔 g.DrawEllipse(new Pen(Color.Tomato), this.Width / 2 - 90, this.Height / 2 - 90, 180, 180); 绘制表盘 g.FillEllipse(Brushes.Red, this.Width / 2 - 5, this.Height / 2 - 5, 10, 10); //绘制中心点 绘制中心点
分别绘制3,6,9,12点 g.DrawString("3", new Font("隶书", 12), Brushes.Red, this.Width / 2 + 90, this.Height / 2-5); g.DrawString("6", new Font("隶书", 12), Brushes.Red, this.Width / 2 - 5, this.Height / 2 + 90); g.DrawString("9",new Font("隶书",12),Brushes.Red,this.Width/2-90,this.Height/2-5); g.DrawString("12", new Font("隶书", 12), Brushes.Red, this.Width / 2 - 5, this.Height / 2 - 90); //分别绘制3,6,9,12点
double hd = Convert.ToDouble(30 * h * Math.PI / 180); double md = Convert.ToDouble(6 * m * Math.PI / 180); double sd = Convert.ToDouble(6 * s * Math.PI / 180); Point hp = new Point((c.X + Convert.ToInt32((Math.Sin(hd)) * 30)), (c.Y - Convert.ToInt32((Math.Cos(hd)) * 30))); //时钟的坐标点 Point mp = new Point((c.X + Convert.ToInt32((Math.Sin(md)) * 60)), (c.Y - Convert.ToInt32((Math.Cos(md)) * 60))); //分钟的坐标点 Point sp = new Point((c.X + Convert.ToInt32((Math.Sin(sd)) * 90)), (c.Y - Convert.ToInt32((Math.Cos(sd)) * 90))); //秒钟的坐标点 g.DrawLine(hPen, c, hp); g.DrawLine(mPen, c, mp); g.DrawLine(sPen, c, sp);
如何用GDI+制作漂亮的电子石英钟?
Thank you!