[WinAPI] HDC 3 – 더블 버퍼링(Double Buffering)

[WinAPI] HDC 3 – 더블 버퍼링(Double Buffering)

안녕하세요 오늘은 더블버퍼링에 대해 알아보겠습니다.

더블 버퍼링을 사용하는 이유와 개념은 이 사이트에서 설명을 잘 해놓았으니 참고해주시길 바랍니다.

더블버퍼링은 결국 화면에 실시간으로 그려지는 과정을 보는게 아니라
메모리에 그려진 결과물을 통으로 copy하여 결과물만 보는 겁니다.
그려야할 오브젝트가 많거나, 비트맵 이미지를 사용하는 경우 작업에 시간이 걸려 화면이 깜빡이므로 더블 버퍼링을 이용하는 경우가 많습니다.

이 글에서는 더블 버퍼링을 이용하여, 간단히 사각형을 그려보도록 하겠습니다.

MFC 응용프로그램 프로젝트를 생성하신 후, 대화상자 헤더파일에 아래와 같이 선언합니다.

HDC m_hdc;	// main DC
HDC m_hdcBuff;	// Buffer DC
HBITMAP m_hbmpBuff;	// Buffer DC HBITMAP
HBITMAP m_hbmpBuffOld;	// 기존 Buffer DC HBITMAP
CRect m_rect;	// 윈도우 크기 읽기용

OnInitDialog에 아래와 같이 코딩합니다.

::GetWindowRect( this->m_hWnd, m_rect ); // 윈도우 크기 구하기

m_hdc = ::GetDC( this->m_hWnd ); // 보여지는 DC
m_hdcBuff = ::CreateCompatibleDC( m_hdc ); // 더블 버퍼링에 사용될 DC 만들기
m_hbmpBuff = ::CreateCompatibleBitmap( m_hdc, m_rect.Width(), m_rect.Height() ); // m_hdcBuff의 HBITMAP 만들기
m_hbmpBuffOld = (HBITMAP)::SelectObject( m_hdcBuff, m_hbmpBuff );

::PatBlt( m_hdcBuff, 0, 0, m_rect.Width(), m_rect.Height(), WHITENESS ); // 하얀 배경 칠하기
::Rectangle( m_hdcBuff, 10, 10, 100, 100 ); // 네모 그리기

확인 버튼을 더블 클릭하여 이벤트 처리 함수를 만들고 아래와 같이 코딩합니다.
확인 버튼에서 미리 Buffer에 그려놓은 네모를 복사 하여 화면에 보이도록 합니다.

void CMFCApplication1Dlg::OnBnClickedOk()
{
	::BitBlt( m_hdc, 0, 0, m_rect.Width(), m_rect.Height(), m_hdcBuff, 0, 0, SRCCOPY );	// 복사
}

프로그램이 종료하는 쪽에 아래와 같이 코딩합니다.

::SelectObject( m_hdcBuff, m_hbmpBuffOld );	// 기존 HBITMAP 선택
::DeleteObject( m_hbmpBuff ); // 만든 HBITMAP 지움
::DeleteDC( m_hdcBuff ); // Buffer 지움

::ReleaseDC( this->m_hWnd, m_hdc ); // DC 해제

코딩이 다 끝났으면 실행해 봅니다.