OFFICE/프로그램

더블 버퍼링, 기본적인 소스

gandus 2011. 8. 4. 20:09

// 보통 그리기 : 깜박임이 있다.

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);
     }
}