안녕하세요. 오늘은 윈도우 창에 메시지 처리하는 과정을 다루어 보겠습니다.
www.youtube.com/watch?v=Fx5bGZ3B_CI&list=PLqCJpWy5Fohd3S7ICFXwUomYW0Wv67pDD&index=4
저번 글에서는 무한루프를 사용해서 창을 띄우기만 했었습니다.
이 영상에서 말하길 게임은 기본적으로 한 가지 루프를 반복적으로 돌린다고 하네요.
윈도우창에서 마우스를 클릭하거나 움직였을 때 해당하는 메시지가 윈도우 창 메시지 큐에 쌓이게 될 것입니다.
그 후 GetMessage() 함수를 통해 가져온 다음 DispatchMessage()라는 함수를 사용하여 WndProc(윈도우 프로시저)
함수에 해당 메시지를 전송하게 됩니다. 이 WndProc는 프로그래머가 직접 구현하는 영역이지만 운영체제가 호출할 때를 판단하는 CALLBACK함수라고 합니다.
저희는 저번 영상에서 window class를 등록할 때 lpfnWndProc 변수를 통해 DefaultWindowProc로 선언을 했었습니다. 즉 저희가 직접 WndProc를 구현하지 않고 기본 기능만 사용하겠다고 한 것이죠. 이 부분에서는 밑에서 한번 더 얘기를 하고 이제 WndProc를 구현해보겠습니다.
WinMain함수 위에 WndProc callback 함수를 생성후
wc의 lpfnWndProc의 WndProc를 지정해 줍니다.
이렇게 해서 저희는 해당 메시지에 따라서 저희들이 원하는 기능을 구현할 수 있습니다. 예를 들어서 마우스를 누르면 공격을 하고 싶다고 하면 해당 마우스 메시지일 경우 공격하는 함수를 실행 이런 식으로 말이죠.
하지만 저희가 사용하는 메시지보다는 사용을 안 하는 메시지가 훨씬 많을 것입니다. 그래서 방금 위에서 말했던 DefWindowProc라는 함수가 존재하고 있습니다. DefWindowProc는 저희가 사용하지 않은 메시지 위에 구현되어있는 함수인데 영상을 보면 먼저 WndProc를 거쳐서 저희들이 원하는 메시지에 대한 처리를 한 후 DefWindowProc로 가서 저희들이 구현하지 않은 여러 메시지들의 기본 동작을 수행하는 것 같습니다.
일단 위 코드에서는 WM_CLOSE라는 종료 메시지가 오면 PostQuitMessage 함수를 통해서 69라는 숫자를 전달하고 프로그램을 종료하게 만들었습니다.
이제 GetMessage() 함수에 대해 알아보겠습니다.
BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
);
Name : lpMsg
Type : LPMSG
기본적인 메시지 정보를 담고 있는 구조체인 것 같습니다.
Name : hWnd
Type : HWND
메시지를 처리하기 위한 핸들 같은데 만약 NULL값으로 값을 전달하면 현재 스레드에 속한 모든 창으로부터 메시지를 받는다고 하네요.
wMsgFilterMin과 wMsgFilterMax는 메시지 큐에서 가져오려는 메시지 번호 범위를 지정해서 어떤 메시지를 받을 것인지 정할 수 있다고 합니다.
기존에 WinMain함수에서 무한루프를 삭제하고 while문을 통해 GetMessage 반환 값이 0 이상일 경우에 계속 루프를 돌려주고 있습니다.
그리고 해당 메시지를 DispatchMessage를 통해 메시지를 전달하고 있습니다.
여기서 TranslateMessage는 DispatchMessage()를 호출하기 전에 메시지를 보충하는 역할을 하는 함수인데요 예를 들어서 키보드를 한번 누르면 WM_KEYDOWN과 WM_KEYUP 이 메시지 큐에 쌓이게 되는데 어떤 키보드가 눌렸는지는 전달하지 않는다고 합니다. 여기서 TranslateMessage는 어떤 키가 눌렸는지 확인을 하고 WM_CHAR를 생성해 메시지를 보충한다고 합니다.
gResult는 아까 저희가 PostQuitMessage 함수를 통해 69라는 수를 반환하고 프로그램을 종료시켰습니다. 그 69를 받아오기 위해서 만든 변수인데요 만약 GetMessage로부터 -1이 반환되면 오류인 것이고 -1이 아니라면 정상적으로 종료가 된 것이라고 판단을 해서 msg의 wParam 변수를 반환하고 있습니다.
이번 글은 여기까지 입니다, 감사합니다.
* 참고 사이트
soen.kr/lecture/win32api/lec4/lec4-1-4.htm
http://soen.kr/lecture/win32api/lec4/lec4-1-4.htm
soen.kr
윈도우의 메시지 처리 과정
개인적으로 공부하는 내용이므로 틀린 부분이 있을 수 있습니다. 있다면 알려주세요 :) [Windows OS의 윈도우 프로그램] Windows 운영체제의 윈도우 프로그램은 메시지 기반으로 동작한다. 여기서
woo-dev.tistory.com
8장. 게임을 위한 순차 패턴 - 게임 루프
"게임 시간 진행을 유저 입력, 프로세서 속도와 디커플링한다." 게임 루프 패턴은 모든 게임에서 사용하며, 어느 것도 서로 똑같지 않고, 게임이 아닌 분야에서는 그다지 쓰이지 않는다는 점에서
lipcoder.tistory.com
'game dev > directX 3D' 카테고리의 다른 글
DirectX 3D 6일차 - 마우스 클래스(Mouse Class) (0) | 2021.04.12 |
---|---|
DirectX 3D 5일차 - 키보드 클래스(Keyboad Class) (0) | 2021.04.12 |
DirectX 3D 4일차 - 윈도우 메시지 사용해보기 (0) | 2021.04.11 |
DirectX 3D 3일차 - 윈도우 메시지 사용해보기 (0) | 2021.03.29 |
DirectX 3D 1일차 - 윈도우 창 생성하기 (0) | 2021.03.29 |