為什麼要使用雙緩衝繪製
在進行多圖元繪製的時候:
因為是要乙個乙個畫上去,所以每畫乙個圖元,系統就要做一次圖形的繪製操作,圖形的重繪是很占用資源的,特別當需要重繪的圖形數量很多的時候,所造成的消耗就特別大,導致閃爍,不流暢等情況。那麼如何來解決這個問題呢?
那就是雙緩衝.
它的基本原理就是
先在記憶體中開闢一塊虛擬畫布,然後將所有需要畫的圖元乙個個先畫在這塊「虛擬畫布」上,最後在一次性將整塊「虛擬畫布」畫到真正的窗體上。因為所有的單個圖形的繪製都不是真正的呼叫顯示系統來「畫」,所以不會占用顯示系統的開銷,極大的提高的繪圖效率,避免閃爍,不流暢等現象。
gdi+實現雙緩衝的具體步驟
ide : vc++/vs.net c++
1.在記憶體中建立一塊「虛擬畫布」:
//獲取視窗客區寬高
rect r;
getclientrect(m_hwnd,&r);
m_bufw=r.right; m_bufh=r.bottom;
//在記憶體中建立乙個image的派生類bitma物件做為"畫布"
bitmap membitmap(m_bufw,m_bufh);
2.獲取這塊記憶體畫布的graphics引用:
graphics memgr(&membitmap);
3.在這塊記憶體畫布上繪圖:
//這裡可以通過memgr在membitmap上繪製多個圖元
//我只舉例繪製了一張
image* pimage=null;
pimage=new image(l"res");
int w=pimage->getwidth();
int h=pimage->getheight();
memgr.drawimage(pimage,0,0,0,0,w,h,unitpixel);
delete pimage;
pimage=null;
4、將記憶體畫布畫到視窗中
m_hdc = getdc(m_hwnd);
graphics gr(m_hdc);
gr.drawimage(&membitmap,0,0);
releasedc(m_hwnd,m_hdc);
GDI雙緩衝的實現
gdi雙緩衝其實就是將我們所需要畫在視窗dc上的物件預先畫在記憶體dc上,再將記憶體dc畫到視窗dc上,這樣就可以減少過多對視窗dc操作而產生閃爍現象。簡單的實現 如下 hdc hdc getdc hwnd hwnd為視窗控制代碼 int nwidth rc.right rc.left rc為視窗的...
GDI 雙緩衝實現
gdi 使用雙緩衝繪圖 我再來詳細解釋一下剛才實現雙緩衝的具體步驟 1 在記憶體中建立一塊 虛擬畫布 bitmap bmp new bitmap 600,600 2 獲取這塊記憶體畫布的graphics引用 graphics g graphics.fromimage bmp 3 在這塊記憶體畫布上繪...
GDI 中的雙緩衝
1 使用.net框架的預設雙緩衝 1 在應用程式中使用雙緩衝的最簡便的方法是使用 net framework 為窗體和控制項提供的預設雙緩衝。通過將 doublebuffered 屬性設定為 true。this.doublebuffered true 2 使用 setstyle 方法可以為 wind...