DirectX 프로그램의 메시지 처리부는 필수 메시지만 최소한으로 처리하고, 그 외 대부분의 작업은 게임 루프 중(유휴 시간, idle)에 수행된다.
하지만 무시할 수 없는 몇 가지 중요 메시지들은 반드시 따로 처리해야 하며, 그 이유는 각각 다르다.
WM_ACTIVATE는 다음과 같이 동작한다.
case WM_ACTIVATE:
if (LOWORD(wParam) == WA_INACTIVE) {
mAppPaused = true;
mTimer.Stop();
} else {
mAppPaused = false;
mTimer.Start();
}
return 0;
목적 : 사용자가 앱을 ALT+TAB으로 다른 창으로 전환하거나, 최소화했을 때를 감지한다.
역할
장점 : CPU 낭비 없이 백그라운드에서 대기, 효율적 자원 사용.
case WM_SIZE:
if (mD3DDevice) {
if (wParam == SIZE_MINIMIZED) {
mAppPaused = true;
mMinimized = true;
mMaximized = false;
} else if (wParam == SIZE_MAXIMIZED) {
mAppPaused = false;
mMinimized = false;
mMaximized = true;
OnResize();
} else if (wParam == SIZE_RESTORED) {
// 복원 상태에서 리사이즈 처리 조건 추가
OnResize();
}
}
return 0;
목적 : 사용자가 윈도우의 크기를 최소화 / 최대화 / 수동 조절할 때를 감지하고 그에 따라 렌더링 및 리소스 처리 상태를 조절한다.
역할
장점
case WM_DESTROY:
PostQuitMessage(0);
return 0;
PostQuitMessage()는 GetMessage()가 false를 반환하도록 하여 Run() 루프를 종료시킨다.
목적 : 사용자가 창을 닫았을 때 애플리케이션을 정상 종료시킨다.
역할 :
중요성 :
이 메시지를 처리하지 않으면 창은 닫히더라도 메시지 루프가 계속 돌아가며 프로그램이 실제로 종료되지 않을 수 있다.
case WM_KEYDOWN:
if (wParam == VK_ESCAPE)
PostQuitMessage(0); // ESC 키로 종료
return 0;
case WM_MOUSEMOVE:
mInput.OnMouseMove(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
return 0;
역할 : 키보드 입력, 마우스 움직임, 클릭 등을 처리하는 기본 메시지이다.