본문 바로가기

Windows

[MFC] Double buffering

// In XXX.h

class XXX {

...

CDC m_memDC;

CBitmap m_bitmap;

...

};



// In XXX.cpp


void XXX::OnPaint()

{

CPaintDC dc(this); // device context for painting

CBitmap *pOldBitmap;

CRect rc;


GetClientRect(&rc);

if (!m_memDC.GetSafeHdc()) 

{

m_memDC.CreateCompatibleDC(&dc);

if (m_bitmap.GetSafeHandle()) {

m_bitmap.DeleteObject();

}

m_bitmap.CreateCompatibleBitmap(&dc, rc.Width(), rc.Height());

}


pOldBitmap = m_memDC.SelectObject(&m_bitmap);

// Draw using memory dc

        Draw(&_memDC);


dc.BitBlt(0, 0, rc.Width(), rc.Height(), &m_memDC, 0, 0, SRCCOPY);


m_memDC.SelectObject(pOldBitmap);

}



필요에 따라 다음과 같이 크기 변경되었을 때 삭제하고 OnPaint함수에서 다시 만들어서 사용하도록 하는 방법도 있겠다.

// In XXX.cpp  : Delete memory dc and bitmap to re-make


void XXX::OnSize(UINT nType, int cx, int cy)

{

...

m_memDC.DeleteDC();

m_bitmap.DeleteObject();

...

}