(四)MFC學習之雙緩衝貼圖
阿新 • • 發佈:2018-12-20
何為雙緩衝?
雙緩衝自然是相對一般的單緩衝而言的,
單緩衝
那麼先從單緩衝開始吧,先上程式碼((二)MFC學習之貼圖 中使用到)
:(程式碼片段)
初始化: CClientDC dc(this); mdc = new CDC; //建立適配dc mdc->CreateCompatibleDC(&dc); mbmp = new CBitmap; mbmp->m_hObject = LoadImage(0, TEXT("crimer2.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); //選取點陣圖(選取背景點陣圖) mdc->SelectObject(mbmpBack); dc.BitBlt(0,0, 786, 481, mdc, 0, 0, SRCCOPY);//
可以看到:LoadImg(這是將點陣圖載入到記憶體)
然後selectObject,選取記憶體中的點陣圖
最後 dc.BitBlt 將記憶體中的點陣圖繪製到視窗(是隻有一次載入到記憶體的,姑且稱之為單緩衝)
再來看看雙緩衝示例:
void CMyWnd::OnPaint() { ////這裡只能使用CPaintDc CPaintDC dc(this); // device context for painting // TODO: 在此處新增訊息處理程式程式碼 // 不為繪圖訊息呼叫 CFrameWnd::OnPaint() CRect rc; GetClientRect(&rc); CDC cacheDc; //快取點陣圖 CBitmap m_cacheCBitmap; cacheDc.CreateCompatibleDC(&dc); m_cacheCBitmap.CreateCompatibleBitmap(&dc, rc.Width(), rc.Height()); CBitmap *pOldBit = cacheDc.SelectObject(&m_cacheCBitmap); //cacheDc.FillSolidRect(rc, RGB(255, 100, 255)); mdc->SelectObject(bmp[0]); //dc.BitBlt(0, 0, rect->right, rect->bottom, mdc, 0, 0, SRCCOPY); //在快取dc 中繪製圖像(在記憶體,未顯示) cacheDc.BitBlt(0, 0, rect->right, rect->bottom, mdc, 0, 0, SRCCOPY); mdc->SelectObject(bmp[1]); switch (mFrameNo) { case 0: cacheDc.BitBlt(x, rect->bottom / 2 - 70, 49, 154, mdc, 49, 0, SRCAND); cacheDc.BitBlt(x, rect->bottom / 2 - 70, 49, 154, mdc, 0, 0, SRCPAINT); mFrameNo = 1; break; case 1: cacheDc.BitBlt(x, rect->bottom / 2 - 70, 49, 154, mdc, 49, 154, SRCAND); cacheDc.BitBlt(x, rect->bottom / 2 - 70, 49, 154, mdc, 0, 154, SRCPAINT); mFrameNo = 0; break; default: break; } //最後 將cacheDc中的影象繪製到顯示器 dc.BitBlt(0, 0, rc.Width(), rc.Height(), &cacheDc, 0, 0, SRCCOPY); //釋放物件 cacheDc.DeleteDC(); m_cacheCBitmap.DeleteObject(); }
雙緩衝的使用:
1,先建立cacheDc
CDC cacheDc;
cacheDc.CreateCompatibleDC(&dc);
2,建立虛擬點陣圖memBmp
(之後各種操作都是將其他點陣圖繪製在這張虛擬點陣圖上)
CBitmap m_cacheCBitmap;
3,建立適配點陣圖
m_cacheCBitmap.CreateCompatibleBitmap(&dc, rc.Width(), rc.Height());
4,往快取dc(cacheDc)繪製圖片
(一般是很多張)
cacheDc.BltBit();
5,使用視窗dc,將快取dc中的虛擬點陣圖選取,繪製顯示到視窗
dc.BitBlt(0, 0, rc.Width(), rc.Height(), &cacheDc, 0, 0, SRCCOPY);
總結:
由以上可以看出;雙緩衝繪圖是比單緩衝多了一次cacheDc
雙緩衝技術使得多張點陣圖以最終一張點陣圖的形式刷到視窗,原本需要貼n次,現在只需要1次,自然解決了多圖閃爍的問題。