天天看點

GDI雙緩沖的實作

GDI雙緩沖其實就是将我們所需要畫在視窗DC上的物件預先畫在記憶體DC上,再将記憶體DC畫到視窗DC上,這樣就可以減少過多對視窗DC操作而産生閃爍現象。

簡單的實作代碼如下:

HDC hDC = ::GetDC(hWnd);	// hWnd為視窗句柄
int nWidth = rc.right-rc.left; // rc為視窗的區域
int nHeight	= rc.bottom-rc.top;
HDC hMemDc = ::CreateCompatibleDC(hDC);	// 建立記憶體DC
HBITMAP hBitmap = ::CreateCompatibleBitmap(hDC, nWidth, nHeight); // 建立位圖
HBITMAP	hOldBmp = ::SelectObject(hMemDc, hBitmap); // 将位圖選到記憶體DC

// 接下來是對記憶體DC進行一系列的畫圖操作
// 注意:所有的操作對應的是記憶體DC的坐标系
::Rectangle(hMemDc, 0, 0, 100, 100);
//......

// 最後将記憶體DC 畫到視窗DC上
::BitBlt(hDC, rc.left, rc.top, nWidth, nHeight, hMemDc, 0, 0, SRCCOPY);
// 釋放
::SelectObject(hMemDc, hOldBmp);
::DeleteDC(hDC);
::DeleteObject(hBitmap);
::ReleaseDC(hWnd, hDC);
           

繼續閱讀