티스토리 뷰
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는 전역으로 해두야 겠죠..
'Development > Windows' 카테고리의 다른 글
비스타 권한 상승 매니페스트 추가 방식들 (3) | 2010.04.07 |
---|---|
Thread 생성에 대한 간략한 코드 이것저것 모음 (0) | 2009.02.10 |
휠 메세지(WM_MOUSEWHEEL)가 안돼요 (0) | 2009.01.06 |
그림 확대/축소가 부드럽게 이루어 지도록 하는 프로그램 (0) | 2009.01.05 |
EDIT Control 안에 있는 내용 한번에 복사하기! (2) | 2008.11.13 |
더블클릭 메세지 사용하기 (0) | 2008.11.13 |
무효화영역을 설정함에 있어서 주의할 점! (0) | 2008.11.11 |
메모리 DC 사용하기 (0) | 2008.10.31 |
- Total
- Today
- Yesterday
- C
- C++
- 프로그래밍
- driver
- Quiz
- 드라이버
- NDK
- jni
- jni강좌
- winapi
- it
- Python
- 안드로이드
- Visual C++
- kering
- API
- db
- algorithm
- Cloud
- AWS
- linux
- android
- MFC
- 음악
- 리눅스
- Troubleshooting
- java
- source
- database
- gcc
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |