우리는 지금까지 WinMain의 메인 루프에서 GetMessage라는 함수를 통해 메시지를 받아 처리하였다. 그리고 스크린에 무언가를 그리기 위해서는 WM_PAINT라는 메시지가 들어올 때에만 처리하였다. 이것은 무엇을 의미하는가?! 맞다. WM_PAINT 메시지가 들어오지 않으면 화면에 그리는 작업을 하지 않는다는 것이다.
위에서 보는 것과 같이 PeekMessage는 GetMessage 함수와 유사하다. 가장 큰 차이점이 있다면 GetMessage 함수는 메시지가 도착하여야지만 리턴되는데 반해(blocking 함수임), PeekMessage 함수는 메시지 큐에 도착한 메시지가 없어도 그냥 리턴한다(non-blocking 함수임)는 점이다.
게임과 같은 프로그램을 생각해보자. 게임과 같은 프로그램에서는 쉴새없이 스크린에 무언가를 그리는 작업을 한다. 당연히 쉴새없이 그려야지만 케릭터의 이동이나 다른 모든 화면의 움직임이 끊기지 않고 부드럽게 이어질 수 있는 것이다. 만약, 이러한 프로그램에서 GetMessage를 통해 메시지를 처리한다면 어떻게 될까? 결과는 불 보듯 뻔하다. 우리는 마우스를 한 손에 부여 잡고 (지속적으로 끊기는 화면에서) 로보트 춤을 추고 있는 우리의 느릿한 주인공을 조종하는데 지쳐 프로그램을 종료해 버릴 것이다. 아~ 대단히 비극적인 일이 아닐 수 없다. :)
하지만 고맙게도 현실은 그렇지 않다. 우리는 부드럽~게 움직이는 케릭터를 조종하며 온갖 화려한 마법을 쓰고 있다. 무엇이 이를 가능케 하는가?! 바로 PeekMessage 함수이다.
BOOL PeekMessage( LPMSG lpMsg, // MSG 구조체에 대한 포인터 |
- Parameters
- lpMsg: 메시지 정보를 받아올 MSG 구조체에 대한 포인터
- hWnd: 메시지의 대상 윈도우. -1로 지정되면 PeekMessage는 hWnd 값이 NULL인, 즉 PostThreadMessage에 의해 포스트된 메시지만을 리턴한다.
- wMsgFilterMin, wMsgFilterMax: 둘 다 0으로 지정하면 필터링없이 모든 메시지를 리턴한다. 만약, 모든 키보드 메시지를 받고 싶다면 각각 WM_KEYFIRST와 WM_KEYLAST로 지정하며, 모든 마우스 메시지를 받고 싶다면 각각 MOUSEFIRST와 WM_MOUSELAST로 지정한다.
- wRemoveMsg:
- PM_NOREMOVE: PeekMessage 수행 후에 메시지 큐에서 메시지가 제거되지 않음.
- PM_REMOVE: PeekMessage 수행 후에는 메시지 큐에서 해당 메시지가 제거됨.
- 이 외에도 PM_NOYIELD, PM_QS_INPUT, PM_QS_PAINT, PM_QS_POSTMESSAGE, PM_QS_SENDMESSAGE 등의 메시지가 있다. 자세한 내용은 MSDN을 참조하기 바란다.
'Programming > API' 카테고리의 다른 글
timeGetTime & GetTickCount (0) | 2009.11.20 |
---|---|
SendMessage vs. PostMessage (0) | 2009.11.06 |
프레임 출력 (0) | 2009.11.06 |
기본 세팅 파일 (0) | 2009.11.06 |