标题:c#双缓冲区技术总结
只看楼主
ljc_zy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:56
专家分:131
注 册:2009-7-14
结帖率:100%
 问题点数:0 回复次数:3 
c#双缓冲区技术总结
推荐一篇文章,对c#的双缓冲技术做了总结,希望对大家有用,高手就不用拍砖了。
原文出自:
http://www.

现在我们来看一下一些高级的应用。今天要讲的是c#如何实现防窗体闪烁的功能。大家都会想到运用双缓冲技术,那么在c#中是如何做的。

1、  利用默认双缓冲

(1)在应用程序中使用双缓冲的最简便的方法是使用 .NET Framework 为窗体和控件提供的默认双缓冲。通过将 DoubleBuffered 属性设置为 true。

       this.DoubleBuffered=true;

(2)使用 SetStyle 方法可以为 Windows 窗体和所创作的 Windows 控件启用默认双缓冲。

SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

2、  手工设置双缓冲

.netframework提供了一个类BufferedGraphicsContext负责单独分配和管理图形缓冲区。每个应用程序域都有自己的默认 BufferedGraphicsContext 实例来管理此应用程序的所有默认双缓冲。大多数情况下,每个应用程序只有一个应用程序域,所以每个应用程序通常只有一个默认 BufferedGraphicsContext。默认 BufferedGraphicsContext 实例由 BufferedGraphicsManager 类管理。通过管理BufferedGraphicsContext实现双缓冲的步骤如下:

(1)获得对 BufferedGraphicsContext 类的实例的引用。

(2)通过调用 BufferedGraphicsContext.Allocate 方法创建 BufferedGraphics 类的实例。

(3)通过设置 BufferedGraphics.Graphics 属性将图形绘制到图形缓冲区。

(4)当完成所有图形缓冲区中的绘制操作时,可调用 BufferedGraphics.Render 方法将缓冲区的内容呈现到与该缓冲区关联的绘图图面或者指定的绘图图面。

(5)完成呈现图形之后,对 BufferedGraphics 实例调用释放系统资源的 Dispose 方法。

完整的例子,在一个400*400的矩形框内绘制10000个随机生成的小圆。

            BufferedGraphicsContext current = BufferedGraphicsManager.Current; //(1)

            BufferedGraphics bg;

            bg = current.Allocate(this.CreateGraphics(),this.DisplayRectangle); //(2)

            Graphics g = bg.Graphics;//(3)

            //随机 宽400 高400

 

            System.Random rnd = new Random();

            int x,y,w,h,r,i;

            for (i = 0; i < 10000; i++)

            {

                x = rnd.Next(400);

                y = rnd.Next(400);

                r = rnd.Next(20);

                w = rnd.Next(10);

                h = rnd.Next(10);

                g.DrawEllipse(Pens.Blue, x, y, w, h);

            }

            bg.Render();//(4)

            //bg.Render(this.CreateGraphics());

            bg.Dispose();//(5)

3、   自己开辟一个缓冲区(如一个不显示的Bitmap对象),在其中绘制完成后,再一次性显示。

完整代码如下:

            Bitmap bt = new Bitmap(400, 400);

            Graphics bg = Graphics.FromImage(bt);

            System.Random rnd = new Random();

            int x, y, w, h, r, i;

            for (i = 0; i < 10000; i++)

            {

                x = rnd.Next(400);

                y = rnd.Next(400);

                r = rnd.Next(20);

                w = rnd.Next(10);

                h = rnd.Next(10);

                bg.DrawEllipse(Pens.Blue, x, y, w, h);

 

            }

            this.CreateGraphics().DrawImage(bt, new Point(0, 0));
收到的鲜花
  • 野比2009-07-21 18:26 送鲜花  30朵   附言:好文章
搜索更多相关主题的帖子: 缓冲区 技术 
2009-07-21 16:38
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
得分:0 
有参考价值。

我们都在路上。。。。。
2009-07-21 17:24
乖老鼠
Rank: 5Rank: 5
来 自:四川省
等 级:职业侠客
威 望:2
帖 子:434
专家分:394
注 册:2008-9-8
得分:0 
来学习,做控件很重要啊

转眼就从编程菜鸟混成了半灌水
2009-07-22 11:26
zhangkecd
Rank: 2
来 自:闲云工作室
等 级:论坛游民
帖 子:159
专家分:91
注 册:2009-3-13
得分:0 
正需要这方面的知识,谢谢了。

闲云野鹤---梦想  
2010-08-31 15:44



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-280047-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.188594 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved