[WinAPI] 백버퍼 사용하기

jh Seo·2024년 1월 24일
0

winapi공부

목록 보기
3/6

개요

winapi를 통해 백버퍼를 구현하기 위해 공부한 것들을 정리해보는 글이다.

백버퍼 생성

  1. GetDC함수를 통해 HDC를 생성해준다.

  2. 기존 DC에 CreateCompatibleDC함수를 이용해 백버퍼dc를 생성해준다.
    이 DC는 출력대상이 없는상태로 그리기 특성만 가지기 때문에 비트맵을 새로 설정해서 연결해야한다.

  3. 따라서 CreateCompatibleBitmap함수를 통해 비트맵을 생성해준다.
    비트맵의 크기는 hdc와 동일하게 맞춰준다.

  4. 3번에서 생성한 비트맵을 백버퍼 DC에 연결해준다.

//1
HDC hdc = GetDC(g_hwind);
//2
g_hDC = CreateCompatibleDC(hdc);                                           
//3
HBITMAP hBitMap = (HBITMAP)CreateCompatibleBitmap(hdc, WINSIZEX, WINSIZEY); 
//4
SelectObject(g_hDC,hBitMap);        

더블 버퍼링

Render함수에서 구현했다.

PAINTSTRUCT ps;
HDC hdc = BeginPaint(g_hwind, &ps);

프론트버퍼 hdc를 선언해준다.

//백버퍼에 흰색으로 칠함
PatBlt(g_hDC, 0, 0, WINSIZEX, WINSIZEY, WHITENESS);

위 에서 얻은 백버퍼 g_hDC를 patBlt함수를 통해 하얗게 초기화한다.

초기화한 백버퍼DC인 g_hDC 에 원하는 그리기 연산들을 다 하고,

//hdc에 복사
BitBlt(hdc, 0, 0, WINSIZEX, WINSIZEY, g_hDC, 0, 0, SRCCOPY);

EndPaint(g_hwind, &ps);

프론트 버퍼 hdc에 복사해주고 EndPaint를 사용해 그리기 끝을 지정해줬다.

화면에 출력은

InvalidateRect(g_hwind, NULL, false);

함수를 통해 이뤄졌다.

주의할 점은 3번째 인자를 false로 해야한다.
true로 하게되면 beginpaint함수시 배경을 지워버린다.
하지만 우린 하얗게 초기화하고 그리는 방식이라 배경을 냅둬야한다.

profile
코딩 창고!

0개의 댓글