더블 버퍼링을 이용한 비트맵 그리기

사용자 삽입 이미지
 
윈도우가 생성되면 WM_PAINT 가 발생된다. 이 때 매개변수를 HDC로 하는 사용자 함수 DrawMenu(HDC hdc)를 호출한다. isMenuClick이라는 false로 초기화 되어있는 Boolean타입의 변수를 검사하고 메뉴비트맵을 그린다. 처음에는 false로 초기화 되어있기 떄문에 평범한 화면의 메뉴를 그리게 되고 이벤트가 발생할 때까지 대기하게 된다.

메뉴를 터치하면 WM_LBUTTONDOWN 이라는 매세지가 호출된다. 터치가 될 때 false로 초기화된 Boolean 변수를 true로 만들고 InvalidateRect(hWnd,NULL,FALSE) 를 호출하는데 이는 강제적으로 다시 WM_PAINT 를 발생하기 위함이다.

그러면 다시 DrawMenu(HDC hdc)를 호출하게 되는데, 터치를함으로써 Boolean변수가 true가 되었기 때문에..(ex)PHONE메뉴를 클릭하면 isPhoneClick 이라는 Boolean변수가 true가 된다.) 기본 메뉴비트맵이 아닌, 선택되었을 때 표시되는 비트맵메뉴를 그리게된다. 반대로 터치가 해제되는 순간 WM_LBUTTONUP 이라는 메시지가 호출되어 true가된 Boolean 변수를 다시 false로 바뀌어주고 InvalidateRect(hWnd,NULL,FALSE)를 호출, WM_PAINT 이벤트를 발생시켜 기본 메뉴를 다시그려주고 다시 이벤트가 발생할 때 까지대기하게 된다.

 

모든 비트맵을 화면에 뿌려주는데 있어서 사용하는 기법은 더블 버퍼링을 사용한다.

더블 버퍼링이란 비트맵을 화면에 그릴 때 화면을 출력하는 기본 도화지격인 hdc 에 바로 하나하나 그리는 게 아니라 BackDC라는 버퍼링 도화지를 하나 더 두어서 BackDC에 다 그려진 비트맵을 한번에 hdc에 그려준다.

정리하면, 단일 버퍼링은 하나의 비트맵객체를 MemDC에 그려서 hdc에 하나하나 그리는 반면, 더블 버퍼링은 MemDC에 그린 하나하나의 비트맵 객체를 큰 도화지인 BackDC에 그려서 다 그려진 BackDC를 한번에 메인도화지인 hdc에 그려주는 것이다.

 

소스코드 예시)

MemDC  = CreateCompatibleDC(hdc); /* 메모리DC 생성함수*/    

BackDC = CreateCompatibleDC(hdc);   /* BackDC 생성*/

hBitmap= CreateCompatibleBitmap(hdc,800,480);  // 도화지속성을지정할비트맵

hOldBufBit=(HBITMAP)SelectObject(BackDC, hBitmap);//지정된 비트맵속성을 BackDC가 선택

 

/* phone */

if(isPhoneClick)

{             

Bitmap_phone_sel = LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_PHONE_SEL));

SelectObject(MemDC, Bitmap_phone_sel);

BitBlt(BackDC,52,104,166,137,MemDC,0,0,SRCCOPY);

}

else

{

Bitmap_phone_nor = LoadBitmap(g_hInst, MAKEINTRESOURCE         (IDB_PHONE_NOR));

SelectObject(MemDC, Bitmap_phone_nor);

BitBlt(BackDC,52,104,166,137,MemDC,0,0,SRCCOPY);

}

/* Mp3 */

If(isMp3Click)

{

.

.

BitBlt(hdc,0,0,800,480,BackDC,0,0,SRCCOPY);

 

비트맵리소스Load -> MemDC Load한 비트맵선택 -> MemDC에 있는 비트맵을 BackDC에 복사

->마지막에 BackDC에 그려진 전체 비트맵들을 메인도화지인 hdc에 복사

'Programing > Windows' 카테고리의 다른 글

더블 버퍼링을 이용한 비트맵 그리기  (0) 2010/09/13
Posted by aarty
<< PREV : [1] : [2] : [3] : [4] : [5] : ... [13] : NEXT >>

BLOG main image
불꽃 남자... by aarty

카테고리

Menu (13)
Programing (12)
Just like (1)
Total : 3,079
Today : 2 Yesterday : 11