GDI+学习(4) 双缓冲技术

现在我们来看一下一些高级的应用。今天要讲的是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));

posted on 2009-07-20 21:07  网络小筑  阅读(3053)  评论(3编辑  收藏  举报

导航