扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:xuejinyoulan 来源:论坛整理 2007年11月20日
关键字:
以下是引用片段: private void SpiderWeb_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; Pen redPen = new Pen(Color.Red); LineDrawRoutine(g, redPen); redPen.Dispose(); g.Dispose(); } |
那么到底作怎么样的改动才能使上面的SpiderWeb
请比较下面双重缓冲区绘图事件与前面介绍的简单绘图事件间的区别:
以下是引用片段: private void SpiderWeb_DblBuff_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; Pen bluePen = new Pen(Color.Blue); Bitmap localBitmap = new Bitmap(ClientRectangle.Width,ClientRectangle.Height); Graphics bitmapGraphics = Graphics.FromImage(localBitmap); LineDrawRoutine(bitmapGraphics, bluePen); //把在内存里处理的bitmap推向前台并显示 g.DrawImage(localBitmap, 0, 0); bitmapGraphics.Dispose(); bluePen.Dispose(); localBitmap.Dispose(); g.Dispose(); } |
上面的示例代码创建了内存位图对象,它的大小等于窗体的客户区域(就是绘图表面)的大小,通过调用Graphics.FromImage将内存中位图的引用传递给Graphics对象,也就是说后面所有对该Graphics对象的操作实际上都是对内存中的位图进行操作的,该操作在C++中等同于将位图对象的指针复制给Graphics对象,两个对象使用的是同一块内存地址。现在Graphics对象表示的是
这一系列的操作完成后还不是特别有效,因为我们先前提到了,控件的样式也是定义Windows 窗体程序行为的一条途径,为了更好的实现双重缓冲区必须设置控件的Opaque属性,这个属性指明窗体是不负责在后台绘制自己的,换句话说,如果这个属性设置了,那么必须为清除和重绘操作添加相关的代码。具备双重缓冲区版本的SpiderWeb程序通过以上的设置在每一次需要重绘时都表现良好,窗体表面用其自己的背景色进行清除,这样就更加减少了闪烁的出现。
以下是引用片段: public SpiderWeb_DblBuff() { SetStyle(ControlStyles.ResizeRedraw | ControlStyles.Opaque, true); } private void SpiderWeb_DblBuff_Paint(object sender, PaintEventArgs e) { Bitmap localBitmap = new Bitmap(ClientRectangle.Width, ClientRectangle.Height); Graphics bitmapGraphics = Graphics.FromImage(localBitmap); bitmapGraphics.Clear(BackColor); LineDrawRoutine(bitmapGraphics, bluePen); } |
结果怎么样?图像的绘制平滑多了。从内存中将蜘蛛网的线条推到前台以显示出来是完全没有闪烁的,但是我们还是稍微停顿一下,先将内存中的位图修整一下再显示出来,可以添加一行代码以便使线条看上去更加平坦。
以下是引用片段: bitmapGraphics.SmoothingMode = SmoothingMode.AntiAlias; |
在将内存中的位图对象赋给Graphics后通过放置这行代码,我们在画布上所画的每一个线条都使用了反锯齿,使凹凸不平的线条显得更加平坦。
具备双重缓冲区技术的且使用AntiAliasing(反锯齿)属性的SpiderWeb_DblBuff示例程序
完成了简单的双重缓冲区应用后有两个问题需要向读者阐明,.Net中的某些控件例如:Button、PictureBox、Label还有PropertyGrid都已经很好的利用了该技术!这些控件在默认状态下会自动启用双重缓冲区技术,用户可以通过对“DoubleBuffer”属性的设置来就可以实现双重缓冲区技术。所以,用户若使用PictureBox来绘制蜘蛛网将会更有效率一些,而且也使程序变得更加简单了。
我们在这里讨论的双重缓冲区技术既不是完全被优化但也没有什么太大的负面影响。双重缓冲区技术是减少Windows 窗体绘制时闪烁的一条重要途径,但是它也确实消耗不少内存,因为它将会使用双倍的内存空间:应用程序所显示的图像和屏幕后方内存中的图像。每次Paint事件被激活时都会动态的创建位图对象,这种机制会相当耗费内存。而自带双重缓冲区技术的控件在使用DoubleBuffer属性后执行起来的优化程度则会更好一些。
使用GDI+的DIB(与
“智能无效”(智能重绘)就是在暗示程序员应该明白仅应对程序中无效的区域进行重绘,对Regions对象所对应的无效区域进行重绘可以提高绘制性能,使用Regions对象你可以仅排除或绘制控件和窗体的部分区域已获得更好的性能。我们现在就开始来看一下BasicClip示例程序,这个程序使用保存在PaintEventArgs对象的ClipRectangle对象,之前我们已经提及,无论何时当程序的大小发生变化时Paint事件都会被激活。BasicClip示例程序用红和蓝两种颜色填充剪切的矩形区域,利用不同的
以下是引用片段: private void BasicClip_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; if (currentBrush.Color == Color.Red) currentBrush.Color = Color.Blue; else currentBrush.Color = Color.Red; g.FillRectangle(currentBrush, e.ClipRectangle); g.Dispose(); } |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者