GDI+——使用Graphics类绘制基本图形

简介: GDI+——使用Graphics类绘制基本图形

目录


绘制基本图形


绘制直线


绘制矩形


绘制椭圆


绘制圆弧


绘制扇形


绘制多边形


绘制文本


综合案例


绘制波形曲线


使用双缓冲技术绘图


绘制基本图形

绘制直线

绘制直线用到了Graphics类的DrawLine方法。该方法最常用的重载方式有两种,


public void DrawLine(Pen pen,Point pt1,Point pt2)

参数说明:


pen:Pen对象,它确定线条的颜色,宽度和样式。


pt1:Point结构,它表示要连接的第一个点。


pt2:Point结构,表示要连接的第二个点。


代码:


       private void button1_Click(object sender, EventArgs e)


       {


           Pen blackPen = new Pen(Color.Black, 3);//实例化Pen类


           Point point1 = new Point(10, 50);//实例化一个Point类


           Point point2 = new Point(100, 50);//再实例化一个Point类


           Graphics g = this.CreateGraphics();//实例化一个Graphics类


           g.DrawLine(blackPen, point1, point2);//调用DrawLine方法绘制直线


       }


public void DrawLine(Pen pen,int x1,int y1,int x2,int y2)

     pen:System.Drawing.Pen,它确定线条的颜色、宽度和样式。


x1:第一个点的 x 坐标。


y1:第一个点的 y 坐标。


x2:第二个点的 x 坐标。


 y2: 第二个点的 y 坐标。


代码:


           private void button1_Click(object sender, EventArgs e)


       {


           Graphics graphics = this.CreateGraphics();//实例化Graphics类


           Pen myPen = new Pen(Color.Black, 3);//实例化Pen类


           graphics.DrawLine(myPen, 150, 30, 150, 100);//调用DrawLine方法绘制直线


     }


绘制矩形

绘制矩形用到了Graphics类的DrawRectangle方法。常用的重载方式有两种:


public void DrawRectangle (Pen pen, Rectangle rect);

参数


pen:Pen对象,它确定矩形的颜色、宽度和样式。


rect:表示要绘制的矩形的 Rectangle 结构。


代码:


public void DrawRectangleRectangle(PaintEventArgs e)


{

   //创建黑色笔。  


Pen blackPen = new Pen(Color.Black, 3);


   // 创建矩形.


   Rectangle rect = new Rectangle(0, 0, 200, 200);


   // 绘制到屏幕上。


   e.Graphics.DrawRectangle(blackPen, rect);


}


public void DrawRectangle (Pen pen, int x, int y, int width, int height);

参数


pen:Pen,它确定矩形的颜色、宽度和样式。


x:要绘制的矩形的左上角的 x 坐标。


y:要绘制的矩形的左上角的 y 坐标。


width:要绘制的矩形的宽度。


height:要绘制的矩形的高度。


public void DrawRectangleInt(PaintEventArgs e)


{

   //创建黑色笔。


   Pen blackPen = new Pen(Color.Black, 3);


   //创建矩形的位置和大小.


   int x = 0;


   int y = 0;


   int width = 200;


   int height = 200;


   //将矩形绘制到屏幕上.


   e.Graphics.DrawRectangle(blackPen, x, y, width, height);


}


绘制椭圆

绘制椭圆用到了Graphics的DrawEllipse方法。常用的重载如下:


public void DrawEllipse (System.Drawing.Pen pen, System.Drawing.Rectangle rect);

参数


pen:Pen,它确定曲线的颜色、宽度和样式。


rect:Rectangle 结构,它定义椭圆的边界。


代码:


private void DrawEllipseRectangle(PaintEventArgs e)


{

   // Create pen.


   Pen blackPen = new Pen(Color.Black, 3);


   // Create rectangle for ellipse.


   Rectangle rect = new Rectangle(0, 0, 200, 100);


   // Draw ellipse to screen.


   e.Graphics.DrawEllipse(blackPen, rect);


}


public void DrawEllipse (System.Drawing.Pen pen, int x, int y, int width, int height);

参数


pen:Pen,它确定曲线的颜色、宽度和样式。


x:定义椭圆的边框的左上角的 X 坐标。


y:定义椭圆的边框的左上角的 Y 坐标。


width:定义椭圆的边框的宽度。


height:定义椭圆的边框的高度。


代码:


private void DrawEllipseInt(PaintEventArgs e)


{

   // Create pen.


   Pen blackPen = new Pen(Color.Black, 3);


   // Create location and size of ellipse.


   int x = 0;


   int y = 0;


   int width = 200;


   int height = 100;


   // Draw ellipse to screen.


   e.Graphics.DrawEllipse(blackPen, x, y, width, height);


}


绘制圆弧

绘制圆弧用到了Graphics类的DrawArc方法。常用的两种重载方式:


1、public void DrawArc (Pen pen, Rectangle rect, float startAngle, float sweepAngle);


参数


pen:Pen,它确定弧线的颜色、宽度和样式。


rect:RectangleF 结构,它定义椭圆的边界。


startAngle:从 x 轴到弧线的起始点沿顺时针方向度量的角(以度为单位)。


sweepAngle:从 startAngle 参数到弧线的结束点沿顺时针方向度量的角(以度为单位)。


代码:


private void DrawArcRectangle(PaintEventArgs e)


{

  // Create pen.


   Pen blackPen= new Pen(Color.Black, 3);


   // Create rectangle to bound ellipse.


   Rectangle rect = new Rectangle(0, 0, 100, 200);


   // Create start and sweep angles on ellipse.


   float startAngle =  45.0F;


   float sweepAngle = 270.0F;


   // Draw arc to screen.


   e.Graphics.DrawArc(blackPen, rect, startAngle, sweepAngle);


}


public void DrawArc (Pen pen, int x, int y, int width, int height, int startAngle, int sweepAngle);

参数


pen:Pen,它确定弧线的颜色、宽度和样式。


x:定义椭圆的矩形的左上角的 x 坐标。


y:定义椭圆的矩形的左上角的 y 坐标。


width:定义椭圆的矩形的宽度。


height:定义椭圆的矩形的高度。


startAngle:从 x 轴到弧线的起始点沿顺时针方向度量的角(以度为单位)。


sweepAngle:从 startAngle 参数到弧线的结束点沿顺时针方向度量的角(以度为单位)。


代码:


private void DrawArcInt(PaintEventArgs e)


{

   // Create pen.


   Pen blackPen= new Pen(Color.Black, 3);


   // Create coordinates of rectangle to bound ellipse.


   int x = 0;


   int y = 0;


   int width = 100;


   int height = 200;


   // Create start and sweep angles on ellipse.


   int startAngle =  45;


   int sweepAngle = 270;


   // Draw arc to screen.


   e.Graphics.DrawArc(blackPen, x, y, width, height, startAngle, sweepAngle);


}


绘制扇形

绘制扇形用到了Graphics的DrawPie方法。常见的重载方式如下:


public void DrawPie (Pen pen, Rectangle rect, float startAngle, float sweepAngle);

参数


pen:Pen,它确定扇形的颜色、宽度和样式。


rect:Rectangle 结构,它表示定义该扇形所属的椭圆的边框。


startAngle:从 x 轴到扇形的第一条边沿顺时针方向度量的角(以度为单位)。


sweepAngle:从 startAngle 参数到扇形的第二条边沿顺时针方向度量的角(以度为单位)


代码:


public void DrawPieRectangle(PaintEventArgs e)


{

   // Create pen.


   Pen blackPen = new Pen(Color.Black, 3);


         


   // Create rectangle for ellipse.


   Rectangle rect = new Rectangle(0, 0, 200, 100);


   // Create start and sweep angles.


   float startAngle =  0.0F;


   float sweepAngle = 45.0F;


   // Draw pie to screen.


   e.Graphics.DrawPie(blackPen, rect, startAngle, sweepAngle);


}


public void DrawPie (Pen pen, int x, int y, int width, int height, int startAngle, int sweepAngle);

参数


pen:Pen,它确定扇形的颜色、宽度和样式。


x:边框的左上角的 x 坐标,该边框定义扇形所属的椭圆。


y:边框的左上角的 y 坐标,该边框定义扇形所属的椭圆。


width:边框的宽度,该边框定义扇形所属的椭圆。


height:边框的高度,该边框定义扇形所属的椭圆。


startAngle:从 x 轴到扇形的第一条边沿顺时针方向度量的角(以度为单位)。


sweepAngle:从 startAngle 参数到扇形的第二条边沿顺时针方向度量的角(以度为单位)。


代码:


public void DrawPieInt(PaintEventArgs e)


{

   // Create pen.


   Pen blackPen = new Pen(Color.Black, 3);


   // Create location and size of ellipse.


   int x = 0;


   int y = 0;


   int width = 200;


   int height = 100;


   // Create start and sweep angles.


   int startAngle =  0;


   int sweepAngle = 45;


   // Draw pie to screen.


   e.Graphics.DrawPie(blackPen, x, y, width, height, startAngle, sweepAngle);


}


绘制多边形

绘制多边形用到了Graphics的DrawPolygon方法。常用的重载方法:


public void DrawPolygon (Pen pen, System.Drawing.Point[] points)

参数


pen:Pen,它确定多边形的颜色、宽度和样式。


points:Point 结构数组,这些结构表示多边形的顶点。


代码:


private void button1_Click(object sender, EventArgs e)


       {

           Graphics ghs = this.CreateGraphics();//实例化Graphics类


           Pen myPen = new Pen(Color.Black, 3);//实例化Pen类


           Point point1 = new Point(80, 20);//实例化Point类,表示第1个点


           Point point2 = new Point(40, 50);//实例化Point类,表示第2个点


           Point point3 = new Point(80, 80);//实例化Point类,表示第3个点


           Point point4 = new Point(160, 80);//实例化Point类,表示第4个点


           Point point5 = new Point(200, 50);//实例化Point类,表示第5个点


           Point point6 = new Point(160, 20);//实例化Point类,表示第6个点


           Point[] myPoints ={ point1, point2, point3, point4, point5, point6 };//创建Point结构数组


           ghs.DrawPolygon(myPen, myPoints);//调用Graphics对象的DrawPolygon方法绘制一个多边形


       }


绘制文本

绘制文本用到Graphics的DrawString方法。常用的重载方法:


public void DrawString (string s, System.Drawing.Font font, System.Drawing.Brush brush, System.Drawing.RectangleF layoutRectangle);

参数


s:要绘制的字符串。


font:Font,它定义字符串的文本格式。


brush:Brush,它确定所绘制文本的颜色和纹理。


layoutRectangle:RectangleF 结构,它指定所绘制文本的位置。


代码:


public void DrawStringRectangleF(PaintEventArgs e)


{

   // Create string to draw.


   String drawString = "Sample Text";


   // Create font and brush.


   Font drawFont = new Font("Arial", 16);


   SolidBrush drawBrush = new SolidBrush(Color.Black);


   // Create rectangle for drawing.


   float x = 150.0F;


   float y = 150.0F;


   float width = 200.0F;


   float height = 50.0F;


   RectangleF drawRect = new RectangleF(x, y, width, height);


   // Draw rectangle to screen.


   Pen blackPen = new Pen(Color.Black);


   e.Graphics.DrawRectangle(blackPen, x, y, width, height);


   // Draw string to screen.


   e.Graphics.DrawString(drawString, drawFont, drawBrush, drawRect);


}


public void DrawString (string s, System.Drawing.Font font, System.Drawing.Brush brush, System.Drawing.PointF point);

参数


s:要绘制的字符串。


font:Font,它定义字符串的文本格式。


brush:Brush,它确定所绘制文本的颜色和纹理。


point:PointF 结构,它指定所绘制文本的左上角。


代码:


public void DrawStringPointF(PaintEventArgs e)


{


   // Create string to draw.


   String drawString = "Sample Text";


   // Create font and brush.


   Font drawFont = new Font("Arial", 16);


   SolidBrush drawBrush = new SolidBrush(Color.Black);


   // Create point for upper-left corner of drawing.


   PointF drawPoint = new PointF(150.0F, 150.0F);


   // Draw string to screen.


   e.Graphics.DrawString(drawString, drawFont, drawBrush, drawPoint);


}


public void DrawString(string s, Font font, Brush brush, float x, float y)

参数:


       s:  要绘制的字符串。


       font:System.Drawing.Font,它定义字符串的文本格式。


brush:System.Drawing.Brush,它确定所绘制文本的颜色和纹理。


       x:所绘制文本的左上角的 x 坐标。


       y:所绘制文本的左上角的 y 坐标。


private void button1_Click(object sender, EventArgs e)


       {


           string str = "神马堂;//定义绘制的字符串


           Font myFont = new Font("华文行楷", 20);//实例化Font对象


           SolidBrush myBrush = new SolidBrush(Color.DarkOrange);//实例化画刷对象


           Graphics myGraphics = this.CreateGraphics();//创建Graphics对象


           myGraphics.DrawString(str, myFont, myBrush,10,20);//绘制文本


       }


综合案例

绘制波形曲线

tt.png

private void button1_Click(object sender, EventArgs e)


  {


           Graphics graphics = this.CreateGraphics();                  //实例化窗体的Graphics类


           Pen myPen = new Pen(Color.Black, 1);                        //设置画笔


           int beginX = 50;                                        //定义变量


           int beginY = 65;


           int height = 35;


           int width = 50;


           Point pointX1 = new Point(beginX, beginY);


           Point pointY1 = new Point(beginX + 210, beginY);


           Point pointX2 = new Point(beginX, beginY - 45);


           Point pointY2 = new Point(beginX, beginY + 45);


           //调用DrawLine方法绘制两条垂直相交的直线,用来作为波形图的横纵坐标


           graphics.DrawLine(myPen, pointX1, pointY1);


           graphics.DrawLine(myPen, pointX2, pointY2);


//绘制上半区域交错连接的贝塞尔曲线


           graphics.DrawBezier(myPen, beginX, beginY, beginX + 15, beginY - height, beginX + 40, beginY - height, beginX + width,beginY);  


//绘制下半区域交错连接的贝塞尔曲线                                 graphics.DrawBezier(myPen, beginX + width, beginY, beginX + width + 15, beginY + height, beginX + width + 40,beginY + height, beginX + width * 2, beginY);  


//绘制上半区域交错连接的贝塞尔曲线                


graphics.DrawBezier(myPen, beginX + width * 2, beginY, beginX + width * 2 + 15, beginY - height, beginX + width * 2+ 40, beginY - height, beginX + width * 3, beginY);


/绘制下半区域交错连接的贝塞尔曲线                               graphics.DrawBezier(myPen, beginX + width * 3, beginY, beginX + width * 3 + 15, beginY + height, beginX + width * 3+ 40, beginY + height, beginX + width * 4, beginY);              /


 }


使用双缓冲技术绘图

双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。主要用来解决窗体大小改变时,出现窗体闪烁的问题。


双缓冲实现过程如下:


1、在内存中创建与画布一致的缓冲区


2、在缓冲区画图


3、将缓冲区位图拷贝到当前画布上


4、释放内存缓冲区


代码:


   public partial class Frm_Main : Form


   {


       public Frm_Main()


       {


           InitializeComponent();


       }


       private void PaintImage(Graphics g)


       {


           //绘图


           GraphicsPath path = new GraphicsPath(new Point[]{ new Point(100,60),new Point(350,200),new Point(105,225),new Point(190,ClientRectangle.Bottom),


               new Point(50,ClientRectangle.Bottom),new Point(50,180)}, new byte[]{


                   (byte)PathPointType.Start,


                   (byte)PathPointType.Bezier,


                   (byte)PathPointType.Bezier,


                   (byte)PathPointType.Bezier,


                   (byte)PathPointType.Line,


                   (byte)PathPointType.Line});


           PathGradientBrush pgb = new PathGradientBrush(path);


           pgb.SurroundColors = new Color[] { Color.Green, Color.Yellow, Color.Red, Color.Blue, Color.Orange, Color.LightBlue };


           g.FillPath(pgb, path);


           g.DrawString("神马堂欢迎你!!", new Font("宋体", 18, FontStyle.Bold), new SolidBrush(Color.Red), new PointF(110, 20));


           g.DrawBeziers(new Pen(new SolidBrush(Color.Green),2),new Point[] {new Point(220,100),new Point(250,180),new Point(300,70),new Point(350,150)});


           g.DrawArc(new Pen(new SolidBrush(Color.Blue), 5), new Rectangle(new Point(250, 170), new Size(60, 60)), 0, 360);


           g.DrawRectangle(new Pen(new SolidBrush(Color.Orange), 3), new Rectangle(new Point(240, 260), new Size(90, 50)));


       }



       private void Form1_Paint(object sender, PaintEventArgs e)


       {


           Bitmap localBitmap = new Bitmap(ClientRectangle.Width, ClientRectangle.Height);


           //创建位图实例


           Graphics bitmapGraphics = Graphics.FromImage(localBitmap);


           bitmapGraphics.Clear(BackColor);


           bitmapGraphics.SmoothingMode = SmoothingMode.AntiAlias;


           PaintImage(bitmapGraphics);


           Graphics g = e.Graphics;//获取窗体画布


           g.DrawImage(localBitmap, 0, 0); //在窗体的画布中绘画出内存中的图像


           bitmapGraphics.Dispose();


           localBitmap.Dispose();


           g.Dispose();


       }


 }


效果:


tt.png



目录
相关文章
|
1月前
|
定位技术 调度
Pixi绘制各种图形
这篇文章作为Pixi.js入门教程的一部分,详细介绍了如何使用Pixi.js绘制各种基本图形,如矩形、圆角矩形、圆形和椭圆,并提供了具体的实现代码。
34 0
Pixi绘制各种图形
|
6月前
|
容器
pyqtgraph绘图类
pyqtgraph绘图类
90 1
|
6月前
|
缓存 前端开发 JavaScript
canvas详解01-绘制基本图形
canvas详解01-绘制基本图形
107 2
|
算法 数据可视化 Windows
【Win32绘图编程,GDI绘图对象】绘图基础,位图处理,绘图消息处理,画笔,画刷,文本绘制(下)
【Win32绘图编程,GDI绘图对象】绘图基础,位图处理,绘图消息处理,画笔,画刷,文本绘制
|
API 图形学
【Win32绘图编程,GDI绘图对象】绘图基础,位图处理,绘图消息处理,画笔,画刷,文本绘制(上)
【Win32绘图编程,GDI绘图对象】绘图基础,位图处理,绘图消息处理,画笔,画刷,文本绘制
|
前端开发
Delphi绘图功能[2] —— 窗体的绘图属性、圆弧类图形、获取Canvas对象(ClientRect解析)
Delphi绘图功能[2] —— 窗体的绘图属性、圆弧类图形、获取Canvas对象(ClientRect解析)
521 0
Delphi绘图功能[2] —— 窗体的绘图属性、圆弧类图形、获取Canvas对象(ClientRect解析)
|
程序员 C# 图形学
使用 C# Graphics 绘图来绘制一个足球
2022卡塔尔世界杯是足球爱好者的狂欢,这与我毫无关系,作为一个缺乏运动的人,还是不要去看人家玩命的运动了。虽然不看球,不过这波热度的持续冲击,还是让我在朋友圈刷到了结局 ———— 球王梅西如愿以偿捧得金杯,后起之秀姆巴佩加冕金靴。但作为程序员,为了增加一些参与感我就拿 C# 画个足球图案吧。
209 0
使用 C# Graphics 绘图来绘制一个足球
|
C# 图形学
C#编程-135:Graphics绘制三维饼状图
C#编程-135:Graphics绘制三维饼状图
147 0
C#编程-135:Graphics绘制三维饼状图
SwiftUI—通过Path路径绘制不规则的线条和图形
SwiftUI—通过Path路径绘制不规则的线条和图形
643 0
SwiftUI—通过Path路径绘制不规则的线条和图形