CreateCompatibleDC
Creates a memory device context that is compatible with the device specified by pDC.
假如需要對(duì)屏幕進(jìn)行比較多的gdi函數(shù)操作,如果每一步操作都直接對(duì)屏幕dc進(jìn)行操作,那出現(xiàn)的大多數(shù)可能性都是屏幕的閃爍。一個(gè)很好的解決方法就是使用內(nèi)存dc,將這些操作全部先在內(nèi)存dc上操作,然后依次性在屏幕上進(jìn)行操作。
例如:如果你單單使用bitblt在屏幕上拷貝一個(gè)圖,那可以直接使用屏幕的dc。但是如果你要先設(shè)置背景(fillrect)然后再bitblt的話,這就涉及到兩個(gè)屏幕dc的操作,這樣的話屏幕很容易閃爍。
void CBounceWnd::OnTimer(UINT_PTR /* wParam */)
{
if (m_bmBall.m_hObject == NULL)
return; // no bitmap for the ball
CRect rcClient;
GetClientRect(rcClient);
CClientDC dc(this);
CBitmap* pbmOld = NULL;
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
pbmOld = dcMem.SelectObject(&m_bmBall);
dc.BitBlt(m_ptCenter.x - m_sizeTotal.cx / 2,
m_ptCenter.y - m_sizeTotal.cy / 2,
m_sizeTotal.cx, m_sizeTotal.cy,
&dcMem, 0, 0, SRCCOPY);
m_ptCenter += m_sizeMove;
if ((m_ptCenter.x + m_sizeRadius.cx >= rcClient.right) ||
(m_ptCenter.x - m_sizeRadius.cx <= 0))
{
m_sizeMove.cx = -m_sizeMove.cx;
}
if ((m_ptCenter.y + m_sizeRadius.cy >= rcClient.bottom) ||
(m_ptCenter.y - m_sizeRadius.cy <= 0))
{
m_sizeMove.cy = -m_sizeMove.cy;
}
dcMem.SelectObject(pbmOld);
dcMem.DeleteDC();
}