// 보통 그리기 : 깜박임이 있다.
void CDoubleBufferingView::DrawNormal(void)
{
CClientDC dc(this);
CBrush brush, *oldBrush;
for(int i=0; i<1000; i++)
{
brush.CreateSolidBrush(RGB(rand()%256, rand()%256, rand()%256));
oldBrush = dc.SelectObject(&brush);
int x = rand()%400;
int y = rand()%200;
dc.Ellipse(x, y, x+rand()%100+100, y+rand()%100+100);
dc.SelectObject(oldBrush);
brush.DeleteObject();
}
dc.SelectObject(oldBrush);
}
// 더블 버퍼링을 이용하여 그리기 : 깜박임이 없다. 시간 지연이 있다.
// MemDC : 가상 화면 DC
// m_Bitmap : 가상 화면 DC 에 그릴 도화지
void CDoubleBufferingView::DrawDoubleBuffering(void)
{
CClientDC dc(this);
CRect rect;
GetClientRect(&rect);
CDC MemDC;
CBitmap* pOldBmp;
// 도화지를 현재 스크린 DC와 일치 시킨다.
m_Bitmap.DeleteObject();
m_Bitmap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
// 가상 화면 DC를 현재 스크린 DC와 일치 시킨다.
MemDC.CreateCompatibleDC(&dc);
// 가상 화면 DC 에 도화지를 깐다.
pOldBmp = MemDC.SelectObject(&m_Bitmap);
// 가상 화면 DC를 흰색으로 설정한다.
MemDC.PatBlt(0,0,rect.Width(), rect.Height(), WHITENESS);
// 가상 화면 DC 에 그림을 그린다.
CBrush brush, *oldBrush;
for(int i=0; i<10000; i++)
{
brush.CreateSolidBrush(RGB(rand()%256, rand()%256, rand()%256));
oldBrush = MemDC.SelectObject(&brush);
int x = rand()%400;
int y = rand()%200;
MemDC.Ellipse(x, y, x+rand()%100+100, y+rand()%100+100);
MemDC.SelectObject(oldBrush);
brush.DeleteObject();
}
// 가상화면 출력을 위해 OnDraw로 간다.
Invalidate();
MemDC.SelectObject(pOldBmp);
MemDC.DeleteDC();
}
void CDoubleBufferingView::OnDraw(CDC* pDC)
{
CDoubleBufferingDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 여기에 원시 데이터에 대한 그리기 코드를 추가합니다.
if(m_nMenu==1)
{
CDC dc;
CRect rect;
GetClientRect(&rect);
// 비트맵 출력
dc.CreateCompatibleDC(pDC);
dc.SelectObject(&m_Bitmap);
pDC->BitBlt(0,0,rect.Width(), rect.Height(), &dc, 0, 0, SRCCOPY);
}
}