1. 程式人生 > >簡單的GDI+雙緩衝的分析與實現

簡單的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);