C# 绘图(1)

本文介绍了.NET中使用GDI+进行图形绘制的基础知识,包括坐标系、颜色、Graphics类、画笔和画刷的使用,以及路径绘制和OnPaint方法的重写。通过示例代码展示了如何绘制直线、椭圆、选择不同类型的画刷以及创建路径,并提供了代码下载链接,帮助读者快速掌握C#图形编程。
摘要由CSDN通过智能技术生成

1. 概述

  • 在.NET 中通过 GDI+(Graphics Device Interface Plus) 来绘制图形;
  • GDI+相关的类分布在下列命名空间中:
    • System.Drawing:提供了最基本的绘图功能(比如画直线、矩形、椭圆等);
    • System.Drawing.Drawing2D: 提供了高级的二维和矢量绘图功能(比如渐变、 图案填充、- 轨迹等)
    • System.Drawing.Imaging: 提供图像处理功能
    • System.Drawing.Text: 提供排版功能
    • System.Drawing.Printing: 提供与打印相关的服务

2. 坐标系和颜色

  • 在.NET 中,坐标系以窗体(或控件)的左上角为原点, 以水平方向为 x 轴,以竖直方向为 y 轴。建立坐标系后,窗体上的每一 个像素均有一个坐标与之对应。
  • 坐标系中的点用 Point 类表示,Point 类的 X 属性和 Y 属性代表该点的横坐标和纵坐标。 另外窗体的大小用 Size 类表示,矩形区域用 Rectangle 类表示。
    在这里插入图片描述
  • Color 结构,用来表示颜色,它的属性 R、G、B 分别代表红、绿、蓝三个分量值。
  • 另外 Color 结构还有一个 Alpha 值,用来设置透明度,Alpha 值为 0 表示完全透明,Alpha 值 255 表示完全不透明,在 0 到 255 之间为半透明。这种表示颜色的方式称为 RGBA 颜色空间。
颜色RGB值
Red255,0,0
Green0,255,0
Blue0,0,255
White255,255,255
Black0,0,0
Yellow255,255,0
Gray128,128,128
Orange255,200,0
Pink255,175,175
Cyan0,255,255
Magenta255,0,255
  • 此外为了便于使用,Color 结构中还定义了 141 个标准色属性,表示常用的颜色。
序号名称序号名称序号名称序号名称序号名称序号名称
1AliceBlue25DarkGray49Gold73LightSkyBlue97OldLace121SeaShell
2AntiqueWhite26DarkGreen50Goldenrod74LightSlateGray98Olive122Sienna
3Aqua27DarkKhaki51Gray75LightSteelBlue109OliveDrab123Silver
4Aquamarine28DarkMagenta52Green76LightYellow100Orange124SkyBlue
5Azure29DarkOliveGreen53GreenYellow77Lime101OrangeRed125SlateBlue
6Beige30DarkOrange54Honeydew78LimeGreen102Orchid126SlateGray
7Bisque31DarkOrchid55HotPink89Linen103PaleGoldenrod127Snow
8Black32DarkRed56IndianRed80Magenta104PaleGreen128SpringGreen
9BlanchedAlmond33DarkSalmon57Indigo81Maroon105PaleTurquoise139SteelBlue
10Blue34DarkSeaGreen58Ivory82MediumAquamarine106PaleVioletRed130Tan
11BlueViolet35DarkSlateBlue59Khaki83MediumBlue107PapayaWhip131Teal
12Brown36DarkSlateGray60Lavender84MediumOrchid108PeachPuff132Thistle
13BurlyWood37DarkTurquoise61LavenderBlush85MediumPurple119Peru133Tomato
14CadetBlue38DarkViolet62LawnGreen86MediumSeaGreen110Pink134Transparent
15Chartreuse39DeepPink63LemonChiffon87MediumSlateBlue111Plum135Turquoise
16Chocolate40DeepSkyBlue64LightBlue88MediumSpringGreen112PowderBlue136Violet
17Coral41DimGray65LightCoral99MediumTurquoise113Purple137Wheat
18CornflowerBlue42DodgerBlue66LightCyan90MediumVioletRed114Red138White
19Cornsilk43Firebrick67LightGoldenrodYellow91MidnightBlue115RosyBrown149WhiteSmoke
20Crimson44FloralWhite68LightGray92MintCream116RoyalBlue140Yellow
21Cyan45ForestGreen69LightGreen93MistyRose117SaddleBrown141YellowGreen
22DarkBlue46Fuchsia70LightPink94Moccasin118Salmon142
23DarkCyan47Gainsboro71LightSalmon95NavajoWhite129SandyBrown143
24DarkGoldenrod48GhostWhite72LightSeaGreen96Navy120SeaGreen144

3. Graphics类

  • 在.NET 中,最核心的绘图类是 Graphics 类,通过它的属性和方法可以非常方便的画 出各种基本图形。
    在这里插入图片描述

  • Graphics是一个非常特殊的类,不能通过它的构造函数创建对象,只能通过窗体或控件的CreateGraphics()方法创建。

  • 创建好Graphics对象后,即可通过它的方法绘制各种各样的几何图形。当我们不需要Graphics对象时,要及时通过Dispose()方法销毁对象,释放资源。

  • 画椭圆方法FillEllipse()方法的第 1 个参数是一个画刷,第 2、3 个参数为椭圆左上角的坐标,第 4个参数为椭圆的宽度,第 5 个参数为椭圆的高度
    在这里插入图片描述

4. 画笔和画刷

  • Pen 类,它指定了线条的类型,比如画笔的颜色、宽度等:
  • .NET 还设计了一个 Pens 类,类中预置了一组宽度为 1 个像素的常见
    颜色画笔。( Pens )
    在这里插入图片描述
  • 画刷(Brush 类)定义了用何种图案填充图形的内部,它是一个抽象基类,不能实例
    化,若要创建画刷,需要使用它的派生类。
    .NET 还设计了一个易于使用的 Brushes 类,类中预置了一套标准色画刷。( Brushes )
    在这里插入图片描述

5. 路径

  • 依次连接 A、B、C、D、E、F、G、H 、I、J 这 10 个点就可以形成一个五角星。
  • 这类由若干子图形连接而成的图形称为路径。路径由 System.Drawing.Drawing2D 命名空间的 GraphicsPath 类实现。
  • 路径的子图形可以是直线、弧、椭圆、矩形等几何图形。如果起点和终点闭合,则称之为闭合路径,否则称之为开放路径。
    在这里插入图片描述
    在这里插入图片描述

6. 重写OnPaint方法

  • OnPaint()方法是 Paint 事件的默认事件处理程序,当窗体发生变化时,系统就会触发 Paint 事件,然后调用 OnPaint()方法绘制窗体。
  • 可以通过重写 OnPaint()方法的方式在窗体上绘制图形。
using System.Drawing;
namespace OnPaintTest
{
    public partial class Form1 : Form
    {
        //重写窗体 Form1 的 OnPaint()方法 
        protected override void OnPaint(PaintEventArgs e)
        {
            //调用基类的 Onpain()方法绘制窗体
            base.OnPaint(e);
            //添加自己的代码绘制图形
            Graphics g = e.Graphics;
            Pen pen = new Pen(Color.Red, 5);
            g.DrawEllipse(pen, 20, 30, 230, 80);
            g.Dispose();
        }
    }
}

7. 绘图示例代码

在这里插入图片描述

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace DrawingTest
{
    public partial class Form1 : Form
    {
        private Brush brush = new SolidBrush(Color.Red);
        public Form1()
        {
            InitializeComponent();
        }
        #region 画直线
        private void buttonDrawLine_Click(object sender, EventArgs e)
        {
            //创建Graphics对象
            //每个窗体均有一个 CreateGraphics()方法成员,代码中的 this 即指窗体 Form1
            Graphics g = this.CreateGraphics();
            Pen pen = new Pen(Color.Red, 5);
            Point startPoint = new Point(100, 80);
            Point endPoint = new Point(300, 80);
            //画直线
            g.DrawLine(pen, startPoint, endPoint);
            //释放资源
            pen.Dispose();
            g.Dispose();
        }
        #endregion

        #region 画椭圆
        private void buttonDrawEllipse_Click(object sender, EventArgs e)
        {
            Graphics g = this.CreateGraphics();
            //SolidBrush brush = new SolidBrush(Color.Green);
            g.FillEllipse(brush, 100, 30, 200, 100);

            g.Dispose();
            brush.Dispose();
        }
        #endregion

        #region 画刷选择
        //实心画刷
        private void radioButtonSolidBrush_CheckedChanged(object sender, EventArgs e)
        {
            brush = new SolidBrush(Color.Green);
        }
        //纹理画刷
        private void radioButtonTextureBrush_CheckedChanged(object sender, EventArgs e)
        {
            brush = new TextureBrush(textureImageList.Images[0]);
        }
        //颜色渐变画刷
        private void radioButtonLinearGradientBrush_CheckedChanged(object sender, EventArgs e)
        {
            Point startPoint = new Point(80, 70);
            Point endPoint = new Point(310, 70);
            brush = new LinearGradientBrush(startPoint, endPoint, Color.Red, Color.Yellow);
        }
        //阴影画刷
        private void radioButtonHatchBrush_CheckedChanged(object sender, EventArgs e)
        {
            brush = new HatchBrush(HatchStyle.ForwardDiagonal, Color.Red, Color.LightGreen);
        }
        #endregion

        #region 画路径
        private void buttonDrawPath_Click(object sender, EventArgs e)
        {
            //定义路径中的顶点
            Point[] pt = new Point[10];
            pt[0] = new Point(120, 46);
            pt[1] = new Point(156, 46);
            pt[2] = new Point(168, 10);
            pt[3] = new Point(180, 46);
            pt[4] = new Point(214, 46);
            pt[5] = new Point(188, 70);
            pt[6] = new Point(198, 106);
            pt[7] = new Point(168, 82);
            pt[8] = new Point(138, 104);
            pt[9] = new Point(150, 70);

            GraphicsPath path = new GraphicsPath(); //创建路径 
            for (int i = 0; i <= 8; i++)
            {
                path.AddLine(pt[i], pt[i + 1]); //添加线段
            }
            path.CloseFigure(); //闭合起点和终点
            Pen pen = new Pen(Color.Black, 5);
            Graphics g = CreateGraphics();
            g.DrawPath(pen, path); //绘制路径
            g.Dispose();
            path.Dispose();
        }
        #endregion

        #region 清除
        private void buttonClear_Click(object sender, EventArgs e)
        {
            Graphics g = this.CreateGraphics();
            g.Clear(BackColor);
            g.Dispose();
        }
        #endregion
    }
}

8. 代码下载地址

https://download.csdn.net/download/weixin_38566632/19478187

下一篇博客 C# 绘图2

  • 10
    点赞
  • 119
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MechMaster

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值