winapi를 통해 백버퍼를 구현하기 위해 공부한 것들을 정리해보는 글이다.
GetDC함수를 통해 HDC를 생성해준다.
기존 DC에 CreateCompatibleDC함수를 이용해 백버퍼dc를 생성해준다.
이 DC는 출력대상이 없는상태로 그리기 특성만 가지기 때문에 비트맵을 새로 설정해서 연결해야한다.
따라서 CreateCompatibleBitmap함수를 통해 비트맵을 생성해준다.
비트맵의 크기는 hdc와 동일하게 맞춰준다.
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함수시 배경을 지워버린다.
하지만 우린 하얗게 초기화하고 그리는 방식이라 배경을 냅둬야한다.