1. 程式人生 > >雙緩衝技術(C# GDI)

雙緩衝技術(C# GDI)

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個隨機生成的小圓。

  1. BufferedGraphicsContext current = BufferedGraphicsManager.Current; //(1)
  2. BufferedGraphics bg;  
  3. bg = current.Allocate(this.CreateGraphics(),this.DisplayRectangle); //(2)
  4. Graphics g = bg.Graphics;//(3)
  5. //隨機 寬400 高400
  6. System.Random rnd = new Random();  
  7. int x,y,w,h,r,i;  
  8. for (i = 0; i < 10000; i++)  
  9. {  
  10.     x = rnd.Next(400);  
  11.     y = rnd.Next(400);  
  12.     r = rnd.Next(20);  
  13.     w = rnd.Next(10);  
  14.     h = rnd.Next(10);  
  15.     g.DrawEllipse(Pens.Blue, x, y, w, h);  
  16. }  
  17. bg.Render();//(4)
  18. //bg.Render(this.CreateGraphics());
  19. bg.Dispose();//(5)

3、   自己開闢一個緩衝區(如一個不顯示的Bitmap物件),在其中繪製完成後,再一次性顯示。

完整程式碼如下:

  1. Bitmap bt = new Bitmap(400, 400);  
  2. Graphics bg = Graphics.FromImage(bt);  
  3. System.Random rnd = new Random();  
  4. int x, y, w, h, r, i;  
  5. for (i = 0; i < 10000; i++)  
  6. {  
  7.     x = rnd.Next(400);  
  8.     y = rnd.Next(400);  
  9.     r = rnd.Next(20);  
  10.     w = rnd.Next(10);  
  11.     h = rnd.Next(10);  
  12.     bg.DrawEllipse(Pens.Blue, x, y, w, h);  
  13. }  
  14. this.CreateGraphics().DrawImage(bt, new Point(0, 0));