在使用VC進行UI開發的時候,繪圖是一個比較常見的操作。
網絡上有很多關於“雙緩衝”繪圖的文章。這裏就自己使用時出現的問題做個總結,和大家分享
例如:
在視圖類(View類)的OnDraw(CDC* pDC)函數中
CDC dcMemeryFirst; //第一個兼容DC
CDC dcMemerySecond; //第二個兼容DC
CBitmap memBmpFirst; //第一張內存Bitmap
dcMemeryFirst.CreateCompatibleDC(pDC); //這裏注意,傳入的參數是pDC
CRect rect;
GetClientRect(&rect); //獲取客戶區的大小,在創建兼容位圖時,指定位圖的大小
memBmpFirst.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
CBrush writeBrush;
writeBrush.CreateSolidBrush(RGB(255,255,255));
dcMemeryFirst.SelectObject(&membmp); //兼容位圖選入到兼容dc,這樣就可以在該位圖上繪製
dcMemeryFirst.FillRect(&rect, &writeBrush); //繪製底色,這裏繪製成白色
dcMemerySecond.CreateCompatibleDC(&dcMemery1);
dcMemerySecond.SelectObject(m_bmtmap); //加載位圖資源的方式有兩種,這裏使用的是從資源中加載的
memBmpFirst.BitBlt(m_point.x, m_point.y,110,157, &dcMemerySecond,0,0,SRCCOPY);
//將第二個兼容DC中的內容繪製到,第一個兼容DC
pDC->BitBlt(0,0,rect.Width(), rect.Height(),&memBmpFirst,0,0, SRCCOPY);
//將第一個兼容DC中的內容繪製到,實際DC
memBmpFirst.DeleteObject();
總結:
1.所謂雙緩衝技術,就是在繪製的時候不是直接繪製到DC表面。而是首先繪製到兼容DC,然後在貼到實際DC。
2.在使用兼容DC的時候一定要將一個位圖對象與之關聯,否則繪製不了。
3.如果缺少上面的dcMemeryFirst.FillRect(&rect, &writeBrush); 那麼你的兼容位圖時黑色的。
分析:
1.爲什麼時候雙緩衝技術?
因爲進行大量繪製的時候,下一個繪製狀態最終可能與上一個狀態差別不是很大,但是這個繪製過程中差距比較大,所以我們在內存中將繪製工作完成,最後使用BitBlt將繪製好的圖貼到目標DC中,可以防止閃爍的出現。(例如在一個View中拖動一張圖片的時候)
2。爲什麼使用上述方法,還是出現閃動現象呢?
你可以重載一下OnEraseBkgnd(CDC* pDC)
在該函數中直接 return TRUE;不要總是刷背景,看看是不是OK了?