메모리DC를 이용한 더블 버퍼링!
기본적으로 화면에 깜빡거리는 현상을 제거하기 위해 사용 된다고 한다.
onDraw에서 그림이 그려지는데, 그 과정에 배경이 지워졌다 그려졌다 하는 그 부분이 우리에겐
깜빡임 현상으로 보이는 것이다.
이러한 현상을 제거하기 위해 메모리 DC에 화면을 그리고 한번에 화면으로 빠르게 복사 해주는것이
메모리DC를 이용한 더블 버퍼링이다!!
void CMy1121Pro2View::OnDraw(CDC* pDC)
{
CMy1121Pro2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CRect rect;
GetClientRect(&rect);
// 메모리 DC와 Bitmap 생성.
CDC memDC;
CBitmap *pOldBitmap, bitmap;
// 메모리DC와 Bitmap의 호환되는 DC객체 생성
memDC.CreateCompatibleDC(pDC);
// 마찬가지로 화면 DC와 호환되는 Bitmap 생성
bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
pOldBitmap = memDC.SelectObject(&bitmap);
memDC.PatBlt(0, 0, rect.Width(), rect.Height(), WHITENESS);
// 메모리 DC에 그리기
DrawImage(&memDC);
// 메모리 DC -> 화면 DC로 복사
pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
//메모리 DC, Bitmap 삭제
memDC.SelectObject(pOldBitmap);
memDC.DeleteDC();
bitmap.DeleteObject();
}
// CxxxxxxxView 그리기
void CxxxxxxxxView::DrawImage(CDC *pDC)
{
// OnDraw 내용 그리기!!
}
CBrush나 CPen이랑 비슷한거 같다.
교수님은 책에도 나와있는 이 좋은 기능을 왜 알려주시지 않았을까....