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值 |
---|---|
Red | 255,0,0 |
Green | 0,255,0 |
Blue | 0,0,255 |
White | 255,255,255 |
Black | 0,0,0 |
Yellow | 255,255,0 |
Gray | 128,128,128 |
Orange | 255,200,0 |
Pink | 255,175,175 |
Cyan | 0,255,255 |
Magenta | 255,0,255 |
- 此外为了便于使用,Color 结构中还定义了 141 个标准色属性,表示常用的颜色。
序号 | 名称 | 序号 | 名称 | 序号 | 名称 | 序号 | 名称 | 序号 | 名称 | 序号 | 名称 |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | AliceBlue | 25 | DarkGray | 49 | Gold | 73 | LightSkyBlue | 97 | OldLace | 121 | SeaShell |
2 | AntiqueWhite | 26 | DarkGreen | 50 | Goldenrod | 74 | LightSlateGray | 98 | Olive | 122 | Sienna |
3 | Aqua | 27 | DarkKhaki | 51 | Gray | 75 | LightSteelBlue | 109 | OliveDrab | 123 | Silver |
4 | Aquamarine | 28 | DarkMagenta | 52 | Green | 76 | LightYellow | 100 | Orange | 124 | SkyBlue |
5 | Azure | 29 | DarkOliveGreen | 53 | GreenYellow | 77 | Lime | 101 | OrangeRed | 125 | SlateBlue |
6 | Beige | 30 | DarkOrange | 54 | Honeydew | 78 | LimeGreen | 102 | Orchid | 126 | SlateGray |
7 | Bisque | 31 | DarkOrchid | 55 | HotPink | 89 | Linen | 103 | PaleGoldenrod | 127 | Snow |
8 | Black | 32 | DarkRed | 56 | IndianRed | 80 | Magenta | 104 | PaleGreen | 128 | SpringGreen |
9 | BlanchedAlmond | 33 | DarkSalmon | 57 | Indigo | 81 | Maroon | 105 | PaleTurquoise | 139 | SteelBlue |
10 | Blue | 34 | DarkSeaGreen | 58 | Ivory | 82 | MediumAquamarine | 106 | PaleVioletRed | 130 | Tan |
11 | BlueViolet | 35 | DarkSlateBlue | 59 | Khaki | 83 | MediumBlue | 107 | PapayaWhip | 131 | Teal |
12 | Brown | 36 | DarkSlateGray | 60 | Lavender | 84 | MediumOrchid | 108 | PeachPuff | 132 | Thistle |
13 | BurlyWood | 37 | DarkTurquoise | 61 | LavenderBlush | 85 | MediumPurple | 119 | Peru | 133 | Tomato |
14 | CadetBlue | 38 | DarkViolet | 62 | LawnGreen | 86 | MediumSeaGreen | 110 | Pink | 134 | Transparent |
15 | Chartreuse | 39 | DeepPink | 63 | LemonChiffon | 87 | MediumSlateBlue | 111 | Plum | 135 | Turquoise |
16 | Chocolate | 40 | DeepSkyBlue | 64 | LightBlue | 88 | MediumSpringGreen | 112 | PowderBlue | 136 | Violet |
17 | Coral | 41 | DimGray | 65 | LightCoral | 99 | MediumTurquoise | 113 | Purple | 137 | Wheat |
18 | CornflowerBlue | 42 | DodgerBlue | 66 | LightCyan | 90 | MediumVioletRed | 114 | Red | 138 | White |
19 | Cornsilk | 43 | Firebrick | 67 | LightGoldenrodYellow | 91 | MidnightBlue | 115 | RosyBrown | 149 | WhiteSmoke |
20 | Crimson | 44 | FloralWhite | 68 | LightGray | 92 | MintCream | 116 | RoyalBlue | 140 | Yellow |
21 | Cyan | 45 | ForestGreen | 69 | LightGreen | 93 | MistyRose | 117 | SaddleBrown | 141 | YellowGreen |
22 | DarkBlue | 46 | Fuchsia | 70 | LightPink | 94 | Moccasin | 118 | Salmon | 142 | |
23 | DarkCyan | 47 | Gainsboro | 71 | LightSalmon | 95 | NavajoWhite | 129 | SandyBrown | 143 | |
24 | DarkGoldenrod | 48 | GhostWhite | 72 | LightSeaGreen | 96 | Navy | 120 | SeaGreen | 144 |
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
}
}