簡單的GDI 雙緩衝的分析與實現

2022-09-01 02:48:11 字數 1146 閱讀 9773

為什麼要使用雙緩衝繪製

在進行多圖元繪製的時候:

因為是要乙個乙個畫上去,所以每畫乙個圖元,系統就要做一次圖形的繪製操作,圖形的重繪是很占用資源的,特別當需要重繪的圖形數量很多的時候,所造成的消耗就特別大,導致閃爍,不流暢等情況。那麼如何來解決這個問題呢?

那就是雙緩衝.

它的基本原理就是

先在記憶體中開闢一塊虛擬畫布,然後將所有需要畫的圖元乙個個先畫在這塊「虛擬畫布」上,最後在一次性將整塊「虛擬畫布」畫到真正的窗體上。因為所有的單個圖形的繪製都不是真正的呼叫顯示系統來「畫」,所以不會占用顯示系統的開銷,極大的提高的繪圖效率,避免閃爍,不流暢等現象。

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...