2.2.5 메세지 루프
윈도우는 메세지를 송신하는 것에 대해서 프로그램과 교환을 합니다.
이 메세지를 사용해, 마우스의 이동이나 키의 눌림 같은, 유저에서의 조작이 전해집니다.
또 메세지는 Windows에서의 커맨드라고 하는 경우도 있습니다.
WinMain 내의 루프를 사용해 메세지가 있는가를 체크합니다.(코드 2.8)
어플리케이션이 유저에서의 문자입력을 받을 경우는, 이 메세지 루프내에 TranslateMessage 함수를 호출할 필요가 있습니다.
TranslateMessage는 가상 키 메세지를 문자 메세지로 변환하는 Windows 함수입니다.
메세지는 DispatchMessage 함수에 대해 WinProc 함수로 보내고, 처리됩니다.
WinMain은 WM_QUIT 메세지가 수신될 때 까지 이 루프를 계속합니다.
WinMain이 시스템에 돌아올 때 반환 값에는, WM_QUIT 메세지의 wParam 파라메터가 저장됩니다.
#코드 2.8 메인의 메세지 루프
// 메인의 메세지 루프
int done = 0;
while(!done){
// PeekMessage는 Windows 메세지가 있는가를 체크하는 비(非)블록 메소드
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
if(msg.message == WM_QUIT)
done = 1;
// 메세지를 디코드해서 WinProc에 전달
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
메세지 루프에서 GetMessage 말고, PeekMessage를 사용하는 것에 주의해주세요.
GetMessage는 메세지를 기다렸다가 돌아옵니다.한편, PeekMessage는 착신하고 있는 메세지가 있는가를 체크합니다만, 처리할 메세지가 없는 경우에 기다리는 것은 할 수 없습니다.
즉, 메세지 루프를 항상 최대한의 속도로 실행해 진행 할 수 있습니다.
이것은 애니메이션을 사용해 그래픽스를 포함한 게임에는 불가결(不可欠)한 동작입니다.
서장으로