protected override void onpaint(painteventargs e)
{
system.drawing.bitmap b = new bitmap(this.width,this.height);//雙緩沖技術(shù),先將所有要畫的畫在該圖片中,再調(diào)用gs畫出該圖片.
graphics g = graphics.fromimage((system.drawing.image)b);
//
在這里畫你所需要畫的
//
e.graphics.drawimage((system.drawing.image)b,0,0);
g.dispose();
base.onpaint (e);
}
其中要用到的一個技術(shù)就是雙緩存技術(shù),雙緩沖技術(shù)是為了解決界面閃爍而采用的一項技術(shù),就是將要繪制的界面先繪制在內(nèi)存中一個虛擬的、和正在顯示的界面同樣大小的一個區(qū)域上,界面變化時將這個內(nèi)存中的圖象一次性繪制到屏幕上。graphics gxoff;if (m_bmpoffscreen == null) //要雙緩沖的位圖。m_bmpoffscreen = new bitmap(clientsize.gxoff = graphics.gxoff.//繪制一些位圖。//從內(nèi)存位圖繪制。}在上面的代碼中,我們通過調(diào)用 graphics 類的靜態(tài) fromimage 方法在與我們的控件大小相同的空位圖中創(chuàng)建了一個 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); //從內(nèi)存位圖繪制 e.graphics.drawimage(m_bmpoffscreen, 0, 0); base.onpaint( e );}
在上面的代碼中,我們通過調(diào)用 graphics 類的靜態(tài) fromimage 方法在與我們的控件大小相同的空位圖中創(chuàng)建了一個 graphics 對象。我們在內(nèi)存中的 graphics 對象上進(jìn)行所有的繪圖,完成后,將整個準(zhǔn)備好的位圖覆蓋到控件的圖形上即可。
添加這段代碼
public void refresh()
{
setstyle(controlstyles.supportstransparentbackcolor,true);
setstyle(controlstyles.allpaintinginwmpaint, true);
setstyle(controlstyles.userpaint, true);
setstyle(controlstyles.doublebuffer, true);
refresh();
}
新聞熱點
疑難解答
圖片精選