簡單的GDI+雙緩衝的分析與實現
為什麼要使用雙緩衝繪製
在進行多圖元繪製的時候:
因為是要一個一個畫上去,所以每畫一個圖元,系統就要做一次圖形的繪製操作,圖形的重繪是很佔用資源的,特別當需要重繪的圖形數量很多的時候,所造成的消耗就特別大,導致閃爍,不流暢等情況。那麼如何來解決這個問題呢?
那就是雙緩衝.
它的基本原理就是
先在記憶體中開闢一塊虛擬畫布,然後將所有需要畫的圖元一個個先畫在這塊“虛擬畫布”上,最後在一次性將整塊“虛擬畫布”畫到真正的窗體上。因為所有的單個圖形的繪製都不是真正的呼叫顯示系統來“畫”,所以不會佔用顯示系統的開銷,極大的提高的繪圖效率,避免閃爍,不流暢等現象。
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//圖片1.png");
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);