프로그래밍/MFC
더블버퍼링, 트리플버퍼링 (CPaint, CDC 클래스)
호군
2010. 12. 24. 19:26
반응형
발췌 : 열혈강의 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)); //배경색 설정
윈도우의 깜빡임을 제거하는 최선의 방법은 더블 버퍼링(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(0, 0, 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();
}
반응형