본문 바로가기
프로그래밍/MFC

더블버퍼링, 트리플버퍼링 (CPaint, CDC 클래스)

by 호군 2010. 12. 24.
반응형
발췌 : 열혈강의  Visual C++ 2008 MFC 윈도우 프로그래밍 p608

윈도우의 깜빡임을 제거하는 최선의 방법은 더블 버퍼링(Double Buffering)입니다. DC에 직접 출력하는 것이 아니라, 화면 DC와 호환되는 메모리 DC(버퍼DC)를 만들어서 모든 그리기 작업을 수행한 후 , 메모리 DC의 내용을 화면 DC로 복사하는 기법입니다.


아래 코드는 트리플버퍼링을 사용하였고, 배경의 색을 설정하고 있다. 
memSuiteDC는 실제 화면인 DC에 그려질 메모리DC이다.
memDC는 memSuiteDC에 그려질 메모리DC이다.

CBufferingDlg
::CBufferingDlg()
{
    m_pBitmap = new CBitmap();
    m_pBitmap->LoadBitmap(IDB_BITMAP1); //리소스ID로 이미지 로드
    m_pBitmap->SetBitmapDimension(56, 88); //이미지크기 설정.
}
void CBufferingDlg::OnPaint()
{
    CPaintDC dc(this); //BeginPaint(), 실제 출력화면
    CDC memDC, memSuiteDC; //메모리DC 화면
    CBitmap *pOldBitmap, BackgroundBitmap
    CRect rect;
 
     //Suite 메모리 DC(Device Context) 설정
    GetClientRect(&rect); 
 
    memSuiteDC.CreateCompatibleDC(&dc);
    BackgroundBitmap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
    pOldBitmap = memSuiteDC.SelectObject(&BackgroundBitmap);
    memSuiteDC.FillSolidRect(0, 0, rect.Width(), rect.Height(), RGB(0,0,0)); //배경색 설

    //단일 메모리 DC 설정
    memDC.CreateCompatibleDC(&dc);
 
    //단일메모리DC를 전체메모리DC에 출력
    CImageInfo *pImageInfo;
    CSize bitmapSize;
  
    bitmapSize = m_pBitmap->GetBitmapDimension();
    memDC.SelectObject(pBitmap);
    memSuiteDC.BitBlt(00, bitmapSize.cx, bitmapSize.cy, &memDC, 0, 0, SRCCOPY);
 
    //전체메모리DC를 실제화면에 출력
    dc.BitBlt(0, 0, rect.Width(), rect.Height(), &memSuiteDC, 0, 0, SRCCOPY);

    //DC제거
    memSuiteDC.SelectObject(&pOldBitmap);
    memDC.DeleteDC();
    memSuiteDC.DeleteDC();
}

반응형