1. 程式人生 > >C#自定義控制元件-消除閃爍

C#自定義控制元件-消除閃爍

開始學習製作自定義控制元件的時候,自定義控制元件在重繪時總是發生閃爍。這是因為直接向螢幕繪圖導致的。自己繪製控制元件的外觀首先要過載OnPaint事件處理函式,該函式的一個簡單示例如下:

  1. protectedoverridevoid OnPaint(PaintEventArgs pe)   
  2. {   
  3.     pe.Graphics.DrawImage(...);   
  4. }  

這裡是直接向OnPaint的引數pe所帶的Graphics繪圖表面進行繪製的,而這也正是導致閃爍的原因。消除閃爍有兩個方法。
一個開啟雙緩衝。這個功能是Control類提供的,自定義控制元件都是直接或間接繼承Control類,所以直接使用此功能是很方便的。在自定義控制元件的建構函式內增加下列程式碼即可。

  1. this.SetStyle(ControlStyles.UserPaint, true);   
  2. this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);   
  3. this.SetStyle(ControlStyles.DoubleBuffer, true);  

這個方法雖然方便,但是不能使我們明白其工作原理。
另一個方法就是自己實現雙緩衝。
首先定義一個私有變數Bitmap _backBuffer,此變數初始化成自定義控制元件的大小,並用此點陣圖生成一個繪圖表面g,先講控制元件繪製到g上,最後將點陣圖_backBuffer一次繪製到e.Graphics繪圖表面,也就是螢幕上。示例程式碼如下:

  1. if (_backBuffer == null)   
  2. {   
  3.     _backBuffer = new Bitmap(this.ClientSize.Width, this.ClientSize.Height);   
  4. }   
  5. Graphics g = Graphics.FromImage(_backBuffer);   
  6. OwnerDraw(g);   
  7. g.Dispose();   
  8. pe.Graphics.DrawImageUnscaled(_backBuffer, 0, 0);