void CMemDrawView::OnDraw(CDC* pDC)
{
CMemDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
// 화면 DC와 호환성 있는 메모리 DC를 만듦
CDC BufferDC;
BufferDC.CreateCompatibleDC(pDC);
// 화면 DC와 호환성 있는 메모리 비트맵을 만듦
CBitmap bmpBuffer;
bmpBuffer.CreateCompatibleBitmap(pDC, 200, 200);
// 메모리 DC에 메모리 비트맵을 선택
CBitmap *pOldBitmap = (CBitmap *)BufferDC.SelectObject(&bmpBuffer);
// 메모리 DC에 그림을 그림
BufferDC.Rectangle(0, 0, 200, 200);
BufferDC.Rectangle(10, 10, 100, 100);
BufferDC.Ellipse(70, 70, 180, 180);
// 메모리 비트맵에 그려진 내용을 화면으로 전송
pDC->BitBlt(0, 0, 200, 200, &BufferDC, 0, 0, SRCCOPY);
// DC 복원
BufferDC.SelectObject(pOldBitmap);
}
void CAnimationView::DrawBitmap()
{
static int nAnimate;
CClientDC dc(this);
// 호환성 있는 메모리 DC를 생성
CDC MemDC, BufferDC;
BufferDC.CreateCompatibleDC(&dc);
MemDC.CreateCompatibleDC(&dc);
// 호환성 있는 메모리 비트맵 생성
CBitmap bmpBuffer;
bmpBuffer.CreateCompatibleBitmap(&dc, 32, 32);
// 리소스에서 비트맵 읽기
CBitmap bmpMask, bmpMan, bmpBack;
bmpMask.LoadBitmap(IDB_MANMASK);
bmpMan.LoadBitmap(IDB_MAN);
bmpBack.LoadBitmap(IDB_BACK);
// 메모리 비트맵 선택
CBitmap *pOB1 = (CBitmap *)BufferDC.SelectObject(&bmpBuffer);
// 배경 다시 그리기
CBitmap *pOB2 = (CBitmap *)MemDC.SelectObject(&bmpBack);
BufferDC.BitBlt(0, 0, 32, 32, &MemDC, 50, 50, SRCCOPY);
// 마스크 그리기
MemDC.SelectObject(&bmpMask);
BufferDC.BitBlt(0, 0, 32, 32, &MemDC, 32*nAnimate, 0, SRCAND);
// 아이콘 그림 그리기
MemDC.SelectObject(&bmpMan);
BufferDC.BitBlt(0, 0, 32, 32, &MemDC, 32*nAnimate, 0, SRCPAINT);
// 메모리 비트맵에 그려진 내용을 화면으로 전송
dc.BitBlt(50, 50, 32, 32, &BufferDC, 0, 0, SRCCOPY);
// 애니메이션 카운터를 증가시킴
if(++nAnimate > 3) nAnimate = 0;
BufferDC.SelectObject(pOB1);
MemDC.SelectObject(pOB2);
}
참조 사이트: