ComputerScience/DirectX11

DirectX11 3D를 보여주기 위한 윈도우 - (2) DXApp.cpp -2 (Run함수 메세지 처리루프)

Moai27 2018. 10. 8. 16:32

※ 본 게시물은 DirectX11을 기준으로 작성한다. 

   또한 순수하게 학습용이므로 절대적으로는 믿지 말 것.


//  "DXApp.cpp"


int DXApp::Run()

{

MSG msg;

ZeroMemory(&msg, sizeof(MSG));// 초기화의 중요성


while (msg.message != WM_QUIT)

{

if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))

{

TranslateMessage(&msg);// 메세지가 어떤것인지 해석.

DispatchMessage(&msg);// 적절한 함수에 매핑

}

else

{

Update();

Render();

}


}


return 0;

}


<MSG 참고자료>

HWND        hwnd;

UINT        message;

WPARAM      wParam;

LPARAM      lParam;

DWORD       time;

POINT       pt;

https://msdn.microsoft.com/ko-kr/library/900ks98t.aspx 참고.


<memset과 Zeromemory함수의 비교>

ZeroMemory는 구조체에서의 변수들에 값을 Zero로 초기화해주는 함수이다.결론적으로 memset과 같은 기능을 한다. (다만 memset함수는 자신이원하는 값으로 채울수있다.) ZeroMemory는 0으로채우는 것을 강조할때 사용하면 좋을 것. http://rockdrumy.tistory.com/493 블로그 참고.



<게임용 Loop>

우리가만든 게임루프의 구조는 WM_QUIT이라는 끝내라는 메세지가 오기전까지 무한으로 while문을 반복하는 형태이다. PeekMessage함수를 통해 메시지를 받아와 메세지가 있을때와 없을때를 구분하는 구조로 게임이라는것의 특성상 계속해서 어떠한 일을 하여야 하기에 이러한 구조를 썼다. 여기서 게임이 비활성화되는 특수한경에대한 상황처리는 되어있지않다. 다만 어떠한 이벤트가일어날때의 처리와, 평소의 IDLE상태의 처리만이 되어있을 뿐이다.


BOOL PeekMessage(

LPMSG lpMsg, 

HWND hWnd, 

UINT wMsgFilterMin, 

UINT wMsgFilterMax, 

UINT wRemoveMsg 

);

PeekMessage라는 함수는 메세지큐에 메세지가 들어왔는지를 검사하고 메세지가있으면 true,없으면 false를 리턴하는 함수다. GetMessage함수와는다르게 큐에 메세지가 들어오기를 기다리지 않는다. PeekMassage()는 hWnd파라미터에 정의된 윈도우와 그 자식윈도우와 관련된 메세지만 보게된다. hWnd가 NULL이면, 현재의 thread를 호출한 윈도우와 관련된 메시지를 보게된다


여기서의 인자값인 PM_REMOVE는 큐에서 메시지를 제거한다는 뜻. PeekMessage함수의 결과가 false일시에는 게임용루프이므로, 평상시에 해야하는것들을 해주면 된다.  (특별한 메시지에대한 이벤트처리가아닌 Idle일때 하는일)


BOOL TranslateMessage(

const MSG *lpMsg 

);

메세지가 어떤것인지 해석하는 녀석이라고 보면된다. 들어온 virtual-key message를 알맞은 character message로 변환해준다.


LONG DispatchMessage(

  const MSG* lpmsg 

);

이 함수는 메세지를 적절한 window procedure에 보내주게 된다. 메시지에 따른 적절한 기능을 하기위한 함수이다.