JHB의 프로그래밍 삽질기

더블 버퍼링 메모 본문

PROGRAMMING/C C++ MFC

더블 버퍼링 메모

roter 2008.12.02 12:11

http://www.winapi.co.kr
의 '더블 버퍼링' 강좌 부분에서 가장 눈에 띄는 부분.

이 코드에서 흔히 오해하기 쉬운 것이 있는데 메모리 비트맵인 hBit와 메모리 DC인 hMemDC와의 관계이다. GDI 출력 함수들은 반드시 DC 핸들을 요구하며 비트맵에 출력하기 위해서는 이 비트맵을 선택하고 있는 메모리 DC의 핸들이 필요하다. 그래서 화면 DC와 호환되는(=비트맵과 호환되는) hMemDC를 생성하고 여기에 비트맵을 선택한 후 출력했다. 이 DC는 어디까지나 비트맵 출력을 위한 임시 DC이므로 비트맵을 다 작성하고 난 다음에는 해제되어야 한다.

더블 버퍼링에서 내부 버퍼라고 칭하는 것은 비트맵이지 메모리 DC가 아니다. 메모리 DC는 비트맵을 선택하기 위해 잠시만 사용되는 DC일 뿐인데 알다시피 비트맵을 선택할 수 있는 DC는 메모리 DC밖에 없기 때문이다. 그래서 전역으로 저장해야 할 대상은 hBit 비트맵이지 hMemDC가 아니다.

-------------------------------------------------------------------------------------------------

다시 말하면, 우리는 hMemDC에 그려주고 있지만 실제로 우리가 전역으로 설정해두어 공유할 부분은

hMemDC=CreateCompatibleDC(hdc);
OldBit=(HBITMAP)SelectObject(hMemDC,hBit);

위의 SelectObject에서 정해준 hBit라는 것! (메모리DC는 HBITMAP에 그림을 그리는듯)


아, 그리고 팁 하나더.
화면을 쏵 비우기 위해서 사용하는
GetClientRect(hWndMain,&crt);
FillRect(hMemDC,&crt,GetSysColorBrush(COLOR_WINDOW));
이것 보다는

hBackDC = CreateCompatibleDC(hdc);
htmpBit = CreateCompatibleBitmap(hdc,800,600);
SelectObject(hBackDC,htmpBit);
Rectangle(hBackDC,0,0,800,600);
//FillRect(hBackDC,&crt,GetSysColorBrush(COLOR_WINDOW)); //이걸로 해줘도 됨

hMemDC에 배경을 다 지워줄꺼면, 이렇게 BackDC를 하나 만들어줘서
BitBlt(hMemDC,0,0,800,600,hBackDC,0,0,SRCCOPY);

BitBlt로 찍어주는게 훨씬 빠른것 같다. (FillRect보다 BitBlt이 빠름!)
물론 hBackDC 선언하는 것도 CREATE에서 한번에 해놓고 실제 버퍼링 할때는 BitBlt만 사용해야겠지요~



이제 실제 출력 부분은
 case WM_PAINT:
  hdc=BeginPaint(hWnd, &ps);
  GetClientRect(hWnd,&crt);
  hMemDC=CreateCompatibleDC(hdc);
  OldBit=(HBITMAP)SelectObject(hMemDC, hBit);
  BitBlt(hdc,0,0,crt.right,crt.bottom,hMemDC,0,0,SRCCOPY);
  SelectObject(hMemDC, OldBit);
  DeleteDC(hMemDC);
  EndPaint(hWnd, &ps);
  return 0;
이게 전부다~ 물론 hBit는 전역으로 해두야 겠죠..

0 Comments
댓글쓰기 폼