출처: http://blog.naver.com/cholwan_atom?Redirect=Log&logNo=140007922345
subject: Win32, Double Buffer
- 방법 -
Windows는 기본적으로 WM_PAINT와 WM_ERASEBACKGROUND
메세지를 받을때 화면을
재구성한다. 하지만 화면에 차례차례 그림을 그리기 때문에 화면이 깜빡이는(flicker) 현상이
발생을 한다.
이처럼 깜빡이는 현상을 방지하기 위해선 우선 WM_ERASEBACKGROUND메세지를
무시하는 방법이 있다. 이 방법은 완벽하지는 않지만
조금 덜 깜빡 거리게 만든다. 우선은 이런
조치를 하고 나서 WM_PAINT쪽에서 Double Buffering을 처리해주면 된다. 방법은
Memory Bitmap을
만들어서 그곳에 그림을 그린 다음 그 Bitmap을 화면에 한 번에 뿌리면 된다.
- Coding -
/*00001*/ HDC hDCMem;
/*00002*/
RECT rect;
/*00003*/ HBITMAP BitMem,
OldBitMap;
/*00004*/
/*00005*/
hDCMem =
CreateCompatibleDC(hdc);
/*00006*/
GetClientRect(m_hWndMain,
&rect);
/*00007*/ BitMem = CreateCompatibleBitmap(hdc, rect.right-rect.left,
rect.bottom - rect.top);
/*00008*/
OldBitMap = (HBITMAP)SelectObject(hDCMem,
BitMem);
/*00009*/ FillRect(hDCMem, &rect,
(HBRUSH)GetStockObject(WHITE_BRUSH)); // 전체를
하얗게 칠하기
/*00010*/
/*00011*/ DrawScore(hDCMem);
/*00012*/
/*00013*/ if( m_iRow != 0 && m_iCol != 0 )
/*00014*/ {
/*00015*/ DrawMatrix(hDCMem);
/*00016*/ DrawSelect(hDCMem);
/*00017*/
}
/*00018*/
/*00019*/ BitBlt(hdc,
rect.left,rect.top,rect.right - rect.left,rect.bottom -
rect.top,hDCMem,0,0,SRCCOPY);
/*00020*/
/*00021*/ BitMem =
(HBITMAP)SelectObject(hDCMem, OldBitMap);
/*00022*/ DeleteDC(hDCMem);
/*00023*/
ReleaseDC(m_hWndMain, hdc);
/*00024*/ DeleteObject(BitMem);
hdc는 함수에 인자로 주어진 HDC이다. 실제로 화면에 보여질 DC는
hdc이다. 여기서 hDCMem이라는
새로운 DC를 만들어서 BitMem이라는 Bitmap을 생성해서 SelectObject로 선택을
해주고 각 서브함수
들은 hdc를 이용하든 그림을 그려주고 나서 19번째 줄 BitBlt를 이용해서비트맵을 한번에 화면에
뿌려주면
된다.
꼭!
case WM_ERASEBKGND:
return 0;
를 해서 백그라운드를 지우는 메시지를 없애버려야 효과가 있다.
[출처] [win32 api]더블 버퍼링 기법|작성자 아톰