목적:
사용처:
파일: Game.h
#pragma once
class Game
{
public:
Game();
~Game();
public:
void Init(HWND hwnd);
void Update();
void Render();
private:
HWND _hwnd = {}; // 윈도우 핸들
HDC _hdc = {}; // 기본 디바이스 컨텍스트
private:
// 더블 버퍼링 관련 변수
RECT _rect; // 현재 그리는 영역의 범위
HDC _hdcBack = {}; // 백 버퍼 디바이스 컨텍스트
HBITMAP _bmpBack = {}; // 백 버퍼 비트맵 (화면 데이터 저장)
};
분석:
1. HDC와 HBITMAP:
HDC (Device Context): 출력 장치와의 인터페이스.HBITMAP: 이미지 데이터를 저장하는 객체._hdcBack: 백 버퍼에서 그림을 그리는 용도._bmpBack: 백 버퍼와 연결된 비트맵.파일: Game.cpp
void Game::Init(HWND hwnd)
{
_hwnd = hwnd;
_hdc = ::GetDC(hwnd); // 윈도우 DC 얻기
// 더블 버퍼링 초기화
::GetClientRect(hwnd, &_rect); // 클라이언트 영역 크기 얻기
_hdcBack = ::CreateCompatibleDC(_hdc); // _hdc와 호환되는 DC 생성
_bmpBack = ::CreateCompatibleBitmap(_hdc, _rect.right, _rect.bottom); // _hdc와 호환되는 비트맵 생성
HBITMAP prev = (HBITMAP)::SelectObject(_hdcBack, _bmpBack); // _hdcBack과 비트맵 연결
::DeleteObject(prev); // 이전 비트맵 객체 삭제
}
분석:
1. DC 생성:
CreateCompatibleDC: 기존 HDC와 호환되는 새로운 HDC 생성.CreateCompatibleBitmap: 특정 HDC와 동일한 포맷의 비트맵 생성.SelectObject: DC에 비트맵을 연결하여 그리기 가능.GetClientRect:파일: Game.cpp
void Game::Render()
{
// 두 번째 버퍼(_hdcBack)에 그리기
{
POINT mousePos = GET_SINGLE(InputManager)->GetMousePos();
wstring str = std::format(L"Mouse({0}, {1})", mousePos.x, mousePos.y);
::TextOut(_hdcBack, 20, 10, str.c_str(), static_cast<int32>(str.size()));
}
// SceneManager의 Render 호출
GET_SINGLE(SceneManager)->Render(_hdcBack);
// 더블 버퍼링: 백 버퍼의 내용을 프론트 버퍼로 복사
::BitBlt(_hdc, 0, 0, _rect.right, _rect.bottom, _hdcBack, 0, 0, SRCCOPY);
// 백 버퍼 초기화
::PatBlt(_hdcBack, 0, 0, _rect.right, _rect.bottom, WHITENESS);
}
분석:
1. 그리기:
_hdcBack에서 진행.BitBlt: 백 버퍼 내용을 프론트 버퍼로 복사.PatBlt: 백 버퍼를 흰색으로 초기화.CreateCompatibleDCCreateCompatibleBitmapSelectObjectBitBltPatBlt