Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- DirectX12
- c
- 동기화
- C언어
- 다중표본화
- DirectX
- DirectXTK
- CommandList
- Input Assembler
- engine
- UE4
- Direct3D
- 코딩
- GPU
- 다이렉트 초기화
- swapchain
- C++
- 전처리문
- Direct Init
- Direct3D Init
- 다이렉트X 튜토리얼
- 프로그래밍
- 세팅
- vertex
- RenderTargetView
- CPU
- View
- DESC
- 다이렉트X
- 게임수학
Archives
- Today
- Total
비타Cpp
메시지 처리부(Message Proc) 본문
대체로 게임 응용프로그램들은 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