[DX] 메시지 처리부 (Window Message)

김진우·2025년 7월 6일

DirectX

목록 보기
12/32
post-thumbnail

DirectX 프로그램의 메시지 처리부는 필수 메시지만 최소한으로 처리하고, 그 외 대부분의 작업은 게임 루프 중(유휴 시간, idle)에 수행된다.
하지만 무시할 수 없는 몇 가지 중요 메시지들은 반드시 따로 처리해야 하며, 그 이유는 각각 다르다.


WM_ACTIVATE – 앱 활성화 / 비활성화 감지

WM_ACTIVATE는 다음과 같이 동작한다.

case WM_ACTIVATE:
    if (LOWORD(wParam) == WA_INACTIVE) {
        mAppPaused = true;
        mTimer.Stop();
    } else {
        mAppPaused = false;
        mTimer.Start();
    }
    return 0;

목적 : 사용자가 앱을 ALT+TAB으로 다른 창으로 전환하거나, 최소화했을 때를 감지한다.

역할

  • 앱이 비활성화되면 타이머를 정지시켜 불필요한 연산을 막는다.
  • 활성화되면 다시 타이머를 시작해 렌더링을 재개한다.

장점 : CPU 낭비 없이 백그라운드에서 대기, 효율적 자원 사용.


WM_SIZE – 창 크기 변경 감지

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;

목적 : 사용자가 윈도우의 크기를 최소화 / 최대화 / 수동 조절할 때를 감지하고 그에 따라 렌더링 및 리소스 처리 상태를 조절한다.

역할

  • SIZE_MINIMIZED: 창이 최소화되면 렌더링을 중단하고 애플리케이션을 일시 정지
  • SIZE_MAXIMIZED: 창이 최대화되면 화면에 맞춰 리소스를 다시 구성하고 렌더링 재개
  • SIZE_RESTORED: 창이 원래 크기로 복원되었을 때 OnResize() 호출을 조건부로 수행

장점

  • 사용자가 창 크기를 바꾸더라도 비정상적인 그래픽 오류나 크기 미스매치가 발생하지 않는다.
  • 창이 최소화되었을 때 CPU 자원을 아끼고, 최대화되었을 때는 품질을 유지할 수 있다.

WM_DESTROY - 프로그램 종료 요청 처리

case WM_DESTROY:
	PostQuitMessage(0);
    return 0;

PostQuitMessage()는 GetMessage()가 false를 반환하도록 하여 Run() 루프를 종료시킨다.

목적 : 사용자가 창을 닫았을 때 애플리케이션을 정상 종료시킨다.

역할 :

  • 메시지 큐에 WM_QUIT 메시지를 넣어 메시지 루프를 빠져나가도록 유도한다.
  • 자원 해제 및 애플리케이션 종료 처리를 안전하게 할 수 있도록 한다.

중요성 :
이 메시지를 처리하지 않으면 창은 닫히더라도 메시지 루프가 계속 돌아가며 프로그램이 실제로 종료되지 않을 수 있다.


WM_INPUT, WM_KEYDOWN, WM_KEYUP, WM_MOUSEMOVE 등 – 사용자 입력 처리

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;

역할 : 키보드 입력, 마우스 움직임, 클릭 등을 처리하는 기본 메시지이다.

0개의 댓글