在C#中我们一般是使用Graphics进行绘制图象,最近我发现一些绘制的小技巧以及问题。我将一一在这里告诉大家。
1、绘制使用双缓冲的方法。
无论什么图形都是由一些线,弧形组成的,绘制完毕一个图形可能需要绘制无数次的线以及弧形,如果我们无数次的从窗口的句柄声称Graphics进行绘制,那么我们就会发现一个很有意思的现象就是画面在一点点地绘制显示,如果我们使用双缓冲的话,那么画面就会在内存中绘制完毕,然后一起排到画面上。下边的代码分别是双缓冲代码和不是双缓冲代码。
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
双缓冲绘制代码
1![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//// <summary>
2
/// 直接绘制
3
/// </summary>
4
void paint1()
5![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
6![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
Graphics gra = Graphics.FromHwnd(this.panel1.Handle);
8
Brush b = new SolidBrush(Color.Black);
9
Pen p = new Pen(b);
10
p.Width = 1;
11
p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
12
gra.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.Default;
13![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
14
for (int i = 0; i < 5000; i++)
15![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
16
float vvv = Convert.ToSingle(i) / 10;
17
gra.DrawLine(p, vvv, vvv + 10, vvv + 10, vvv + 10);
18
gra.DrawLine(p, 500 - vvv, vvv + 10, vvv + 10, vvv + 10);
19
}
20![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
p.Dispose();
22
b.Dispose();
23
gra.Dispose();
24
}
25![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
26![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//// <summary>
27
/// 双缓冲绘制
28
/// </summary>
29
void paint2()
30![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
31
Graphics gra = Graphics.FromHwnd(this.panel1.Handle);
32
Bitmap b = new Bitmap(this.Width, this.Height);
33
Graphics bgra = Graphics.FromImage(b);
34
Brush brush = new SolidBrush(Color.Yellow);
35
Pen p = new Pen(brush);
36
p.Width = 1;
37
p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
38
bgra.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.Default;
39![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
40
for (int i = 0; i < 5000; i++)
41![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
42
float vvv = Convert.ToSingle(i) / 10;
43
bgra.DrawLine(p, vvv, vvv + 10, vvv + 10, vvv + 10);
44
bgra.DrawLine(p, 500 - vvv, vvv + 10, vvv + 10, vvv + 10);
45
}
46
gra.DrawImage(b, 0, 0);
47![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
48
bgra.Dispose();
49
p.Dispose();
50
brush.Dispose();
51
b.Dispose();
52
gra.Dispose();
53
}
2、关于SmoothingMode的使用
有时候,我们需要绘制一些虚线,或者险段之类的线,我们只需要改变声明的Pen变量的DashStyle属性值就可以了。但是绘制的时候我发现,如果我将DashStyle的属性更改为Dot(也就是虚线)但是如果我们画的线是水平或者垂直的并且SmoothingMode为Default的话,Graphics会为我们绘制的很好,但是如果为一条倾斜的线,那么我们就会发现绘制很不好看,会曲曲弯弯,这时我们需要将SmoothingMode改变为HighQuality就可以了,虽然效果也不是很好,但是也已经不错了。而且我发现了一个很有意思的事情,就是当SmoothingMode为HighQuality时,DashStyle为Dot(也就是虚线)时,在水平以及垂直的时候绘制出来的却是一条直线,而且颜色也不纯了,可能这时其内部处理的原因。所以如果我们想绘制水平或者垂直的虚线,就需要将SmoothingMode设置为Default就可以了。
未完待续。。。。。。