비타Cpp

메시지 처리부(Message Proc) 본문

DirectX12/튜토리얼

메시지 처리부(Message Proc)

멍C 2021. 12. 4. 13:42

대체로 게임 응용프로그램들은 Win32 메시지를 그리 많이 다루지 않는다. 응용 프로그램 코드의 핵심부는 Win32의 메시지 처리부의 유휴상태(Idle) 처리 도중에 실행된다.(즉, Window 메시지가 없을때.) 그래도 필수적으로 처리해야 할 주요 메시지들이 있긴하다. 예를 들면 게임을 하다가 ALT+Tab을 하여 포커스를 응용프로램이 아닌 다른 프로그램으로 전환할때 게임들이 일시정지된는 경우가 있다.

 

다음은 예제 프로그램에 있는 메시지 처리부 부분이다.

LRESULT D3DApp::MsgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch (msg)
	{
	// WM_ACTIVATE는 창이 활성화되거나 비활성화 될때 보내집니다.
	// 창이 비활성화 되면 게임을 일시정지시키고 활성화되면 시작하도록 해야합니다.
	case WM_ACTIVATE:
		if(LOWORD(wParam) == WA_INACTIVE)
		{
			mAppPaused = true;
			mTimer.Stop();
		}
		else
		{
			mAppPaused = false;
			mTimer.Start();
		}
		return 0;

	//WM_SIZE는 창이 Resize될때 보내집니다.
	case WM_SIZE:
		//새로운 클라이언트 영역을 저장한다.
		mClientWidth  = LOWORD(lParam);
		mClientHeight = HIWORD(lParam);
		if (md3dDevice)
		{
			if (wParam == SIZE_MINIMIZED)
			{
				mAppPaused = true;
				mMinimized = true;
				mMaximized = false;
			}
			else if (wParam == SIZE_MINIMIZED)
			{
				mAppPaused = false;
				mMinimized = false;
				mMaximized = true;
				OnResize();
			}
			else if (wParam == SIZE_RESTORED)
			{
				//최소화 상태에서 다시 복구하는지 여부
				if (mMinimized)
				{
					mAppPaused = false;
					mMinimized = false;
					OnResize();
				}

				//최대화 상태에서 다시 복구하는지 여부
				else if (mMaximized)
				{
					mAppPaused = false;
					mMaximized = false;
					OnResize();
				}
				else if (mResizing)
				{
					//
				}
				else
				{
					OnResize();
				}
			}
		}
		return 0;

	// WM_ENTERSIZEMOVE는 resize 바 부분을 집으면 보내집니다.
	case WM_ENTERSIZEMOVE:
		mAppPaused = true;
		mResizing = true;
		mTimer.Stop();
		return 0;

	//WM_EXITSIZEMOVE는 resize 바 부분을 놓으면 보내집니다.
	//여기서 새로운 위도우 사이즈를 다시 설정합니다.
	case WM_EXITSIZEMOVE:
		mAppPaused = false;
		mResizing = false;
		mTimer.Start();
		OnResize();
		return 0;

	//WM_DESTROY는 윈도우를 종료시킬때 보내집니다.
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;

	// WM_MENUCHAR 메세지는 유저가 활성화 되어 있는 메뉴를 눌렀을때 전송 됩니다.
	case WM_MENUCHAR:
		//Alt를 입력할때 비프음이 울리지 않습니다.
		return MAKELRESULT(0, MNC_CLOSE);

	//이 메세지는 창이 너무 작아지는걸 막기위해 보내진다.
	case WM_GETMINMAXINFO:
		((MINMAXINFO*)lParam)->ptMinTrackSize.x = 200;
		((MINMAXINFO*)lParam)->ptMinTrackSize.y = 200;
		return 0;
	
	//마우스 키보드 입력상태 메세지들
	case WM_LBUTTONDOWN:
	case WM_MBUTTONDOWN:
	case WM_RBUTTONDOWN:
		OnMouseDown(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
		return 0;
	case WM_LBUTTONUP:
	case WM_MBUTTONUP:
	case WM_RBUTTONUP:
		OnMouseUp(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
		return 0;
	case WM_MOUSEMOVE:
		OnMouseMove(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
		return 0;
	case WM_KEYUP:
		if (wParam == VK_ESCAPE)
		{
			PostQuitMessage(0);
		}
		else if ((int)wParam == VK_F2)
			Set4xMsaaState(!m4xMsaaState);

		return 0;
	}

	return DefWindowProc(hwnd, msg, wParam, lParam);
}

 

'DirectX12 > 튜토리얼' 카테고리의 다른 글

Direct3D 정점(Vertex) 입력과 배치  (0) 2021.12.05
Direct3D 초기화 예제  (0) 2021.12.04
FPS : Frames Per Second(초당 프레임 수)  (0) 2021.10.16
Direct3D Base 클래스 - D3DApp  (0) 2021.10.16
시간 측정  (0) 2021.10.10
Comments