1. 程式人生 > >使用記憶體DC解決重畫閃爍問題

使用記憶體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);

}


為易於理解,以上程式碼未經優化。