본문 바로가기

카테고리 없음

더블 버퍼링

출처: 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;

를 해서 백그라운드를 지우는 메시지를 없애버려야 효과가 있다.