雙緩沖技術(C# GDI)

来源:互联网 发布:对角化矩阵的谱分解 编辑:程序博客网 时间:2024/06/07 08:01

http://blog.csdn.net/gisfarmer/article/details/4366707

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));


原创粉丝点击