장치 초기화
<aside> 💡
DirectDraw Device 생성
DirectDrawCreate(nullptr, &m_pDD, nullptr)
Device는 COM객체 (COM Interface 사용)
DirectDraw Device는 COM 객체이므로, COM의 규칙에 따라 참조 카운트 관리 필요
(예: 사용 후 `Release` 호출)
ID3D11Device 를 여러 개 만들 수도 있고, 그렇기 때문에 이것들을 체계적으로 메모리 관리하기 위해 참조카운트를 사용한다고 보면 됨QueryInterface
m_pDD->QueryInterface(IID_IDirectDraw7, (LPVOID*)&m_pDD7)
COM 객체가 제공하는 여러 인터페이스 중, 특정 인터페이스(IDirectDraw7 등)를 요청하여 해당 인터페이스를 사용할 수 있는지 확인하고, 지원할 경우 그 포인터를 반환
기본 DirectDraw 객체 생성:
QueryInterface 호출:
AddRef 를 호출하여 참조카운트를 증가Front Buffer (= Primary Surface) 생성
m_pDD7->CreateSurface(&ddsd, &m_pDDPrimary, nullptr)
SURFACEDESC에 DSCAPS_PRIMARYSURFACE 명시전체 모니터상에서의 응용프로그램의 윈도우의 좌표 얻기
모니터를 기준으로 한 좌표계상에서의 현재 응용프로그램 윈도우의 좌상단, 우하단 좌표위치를 얻기
좌표위치를 통해 윈도우의 width, height 계산
OnUpdateWindowPos 는 창의 위치나 크기에 대한 변경이 생겼을 때 WinAPI에서 호출하는 함수
아래 코드를 이해하기 위해선 구조체의 메모리 구조를 잘 이해해야함
구조체는 배열처럼 연속된 메모리 공간임
Rect 구조체는 left, top, right, bottom 순으로 변수들이 있기에
&m_rcWindow.left를 (POINT*)&m_rcWindow.left로 캐스팅하면,
포인트 구조체 $(x, y)$ 이므로 x = left, y = top이 됨
void CDDrawDevice::OnUpdateWindowPos()
{
GetClientRect(m_hWnd, &m_rcWindow);
::ClientToScreen(m_hWnd, (POINT*)&m_rcWindow.left);
::ClientToScreen(m_hWnd, (POINT*)&m_rcWindow.right);
}
BackBuffer생성
CreateSurface로 생성하면 됨DDSCAPS_OFFSCREENPLAIN 플래그를 주면 해당 메모리를 자유롭게 Read/Write 가능