使用記憶體DC解決重畫閃爍問題
下述程式碼在OnDraw時繪圖:
void CRedrawDemoView::OnDraw(CDC* pDC)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
{
CRedrawDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
staticconstchar* pText = "解決重畫閃爍問題!";
RECT clRect;
::GetClientRect(m_hWnd, &clRect);
pDC->FillSolidRect(&clRect, RGB(255, 255, 255));
int x = 100, y = 100;
RECT rect = { x - 20, y - 20};
rect.right = rect.left + 160;
rect.bottom = rect.top + 60;
pDC->FillSolidRect(&rect, RGB(0, 255, 0));
pDC->TextOut(x, y, pText, strlen(pText));
}
首先將背景填充白色,然後畫一綠色的矩形,再在矩形上輸出一段文字,如此過程必然會引起畫面閃爍,
解決辦法:使用記憶體DC,先將圖形繪製到記憶體DC,然後拷貝到螢幕,實現無閃爍繪圖。
修改後的程式碼如下:
void CRedrawDemoView::OnDraw(CDC* pDC)
{
CRedrawDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
staticconstchar* pText = "解決重畫閃爍問題!";
CRect clRect;
::GetClientRect(m_hWnd, &clRect);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC, clRect.Width(), clRect.Height());
CBitmap * pOldBitmap = memDC.SelectObject(&bitmap);
memDC.FillSolidRect(&clRect, RGB(255, 255, 255));
int x = 100, y = 100;
RECT rect = { x - 20, y - 20};
rect.right = rect.left + 160;
rect.bottom = rect.top + 60;
memDC.FillSolidRect(&rect, RGB(0, 255, 0));
memDC.TextOut(x, y, pText, strlen(pText));
pDC->BitBlt(0, 0, clRect.Width(), clRect.Height(), &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOldBitmap);
}
也可以在上述程式碼中加入繪製Bitmap點陣圖程式碼,注意應該阻止視窗擦除背景,過載OnEraseBkgnd函式
BOOL CRedrawDemoView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return TRUE;
// return CView::OnEraseBkgnd(pDC);
}
為易於理解,以上程式碼未經優化。