protected override void OnPaint(PaintEventArgs e)
{
System.Drawing.Bitmap b = new Bitmap(this.Width,this.Height);//雙緩沖技術,先將所有要畫的畫在該圖片中,再調用GS畫出該圖片.
Graphics g = Graphics.FromImage((System.Drawing.Image)b);
//
在這裡畫你所需要畫的
//
e.Graphics.DrawImage((System.Drawing.Image)b,0,0);
g.Dispose();
base.OnPaint (e);
}
其中要用到的一個技術就是雙緩存技術,雙緩沖技術是為了解決界面閃爍而采用的一項技術,就是將要繪制的界面先繪制在內存中一個虛擬的、和正在顯示的界面同樣大小的一個區域上,界面變化時將這個內存中的圖象一次性繪制到屏幕上。Graphics gxOff;if (m_bmpOffscreen == null) //要雙緩沖的位圖。m_bmpOffscreen = new Bitmap(ClIEntSize.gxOff = Graphics.gxOff.//繪制一些位圖。//從內存位圖繪制。}在上面的代碼中,我們通過調用 Graphics 類的靜態 FromImage 方法在與我們的控件大小相同的空位圖中創建了一個 Graphics 對象。
======================================
通常,雙緩存邏輯如下所示:
protected override void OnPaint(PaintEventArgs e ){Graphics gxOff; //屏幕外的圖像 if (m_bmpOffscreen == null) //要雙緩沖的位圖 { m_bmpOffscreen = new Bitmap(ClientSize.Width, ClientSize.Height); } gxOff = Graphics.FromImage(m_bmpOffscreen); gxOff.Clear(this.BackColor); //繪制一些位圖 gxOff.DrawImage(bmpParent, 0, 0, bmpRect, GraphicsUnit.Pixel); //邊界矩形Rectangle rc = this.ClIEntRectangle; rc.Width--; rc.Height--; //繪制邊界 gxOff.DrawRectangle(new Pen(Color.Black), rc); //從內存位圖繪制 e.Graphics.DrawImage(m_bmpOffscreen, 0, 0); base.OnPaint( e );}
在上面的代碼中,我們通過調用 Graphics 類的靜態 FromImage 方法在與我們的控件大小相同的空位圖中創建了一個 Graphics 對象。我們在內存中的 Graphics 對象上進行所有的繪圖,完成後,將整個准備好的位圖覆蓋到控件的圖形上即可。
添加這段代碼
public void refresh()
{
SetStyle(ControlStyles.SupportsTransparentBackColor,true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.DoubleBuffer, true);
Refresh();
}