使用Graphics画图的小技巧

在C#中我们一般是使用Graphics进行绘制图象,最近我发现一些绘制的小技巧以及问题。我将一一在这里告诉大家。

1、绘制使用双缓冲的方法。

     无论什么图形都是由一些线,弧形组成的,绘制完毕一个图形可能需要绘制无数次的线以及弧形,如果我们无数次的从窗口的句柄声称Graphics进行绘制,那么我们就会发现一个很有意思的现象就是画面在一点点地绘制显示,如果我们使用双缓冲的话,那么画面就会在内存中绘制完毕,然后一起排到画面上。下边的代码分别是双缓冲代码和不是双缓冲代码。

 

ContractedBlock.gif ExpandedBlockStart.gif 双缓冲绘制代码
 1ExpandedBlockStart.gifContractedBlock.gif     /**//// <summary>
 2        /// 直接绘制
 3        /// </summary>

 4        void paint1()
 5ExpandedBlockStart.gifContractedBlock.gif        {
 6
 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
14            for (int i = 0; i < 5000; i++)
15ExpandedSubBlockStart.gifContractedSubBlock.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
21            p.Dispose();
22            b.Dispose();
23            gra.Dispose();
24        }

25
26ExpandedBlockStart.gifContractedBlock.gif        /**//// <summary>
27        /// 双缓冲绘制
28        /// </summary>

29        void paint2()
30ExpandedBlockStart.gifContractedBlock.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
40            for (int i = 0; i < 5000; i++)
41ExpandedSubBlockStart.gifContractedSubBlock.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, 00);
47
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就可以了。

 

未完待续。。。。。。

转载于:https://www.cnblogs.com/yangyang8848/archive/2009/03/24/1420254.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值