Windows API 함수 중 운영체제의 메세지 큐로부터 메세지를 가져오는 함수로 GetMessage()와 PeekMessage()가 있다.
[공통점]
두 함수는 모두 메세지 큐로부터 메세지를 가져온다. 두 함수는 동일한 매개변수 4개를 가진다. 그중에 첫 번째 인자로 MSG 구조체를 받는다. 메세지 큐로부터 얻은 메세지 값을 MSG 구조체에 저장한다.
[GetMessage()]
GetMessage()는 메세지 큐에 메세지가 존재한다면 가져와서 MSG 구조체에 그 값을 저장하고 TRUE를 반환한다. 그런데 만약 읽은 메세지가 WM_QUIT이면 FALSE를 리턴한다. WM_QUIT은 메세지 루프를 종료하기 위한 조건으로 사용된다. 만약 메세지 큐에 메세지가 존재하지 않으면 메세지가 생성될 때까지 무한정 기다린다. 이는 scanf 또는 cin과 같은 함수 사용 시 사용자가 입력할 때까지 무한정 기다리는 것과 같다. 때문에 이러한 상황을 생각하여 사용하기 적절한지 상황인지 생각해야 한다.
이러한 메세지들을 가져오면 TranslateMessage() 라는 함수를 통해 번역을 하고, DispatchMessage()라는 함수를 통해 메세지 처리 함수(WndProc)으로 전달한다. WndProc이 최종적으로 해당 메세지를 처리한다. 윈도우의 모든 메세지는 이처럼 3개의 함수를 거친다.
[PeekMessage()]
PeekMessage()는 메세지 큐에 메세지가 존재한다면 가져와서 MSG 구조체에 그 값을 저장하고 0이 아닌 값을 반환한다. 해당 함수는 메세지 큐가 비어있을 때 GetMessage() 처럼 무한정 기다리지 않고 바로 0을 리턴한다. 때문에 PeekMessage() 함수는 무한 대기에 빠지지 않고, 메세지 큐가 비었다면 다음과 같이 다른 작업을 해줄 수 있다. 해당 함수도 메세지를 읽어오면 GetMessage와 동일하게 메세지가 번역되어 메세지 처리 함수로 보내진다.
if(PeekMessage(...))
{
// 메세지 번역 및 메세지 처리 함수로 전송
}
else
{
// 메세지 큐가 비었다면 다른 작업을 수행한다.
}
'게임 공부 > Windows API' 카테고리의 다른 글
[WinAPI] 윈도우 크기 고정시키기, 리사이즈 막기 (0) | 2020.09.07 |
---|---|
UpdateWindow()와 InvalidateRect()와 WM_PAINT 메세지 (0) | 2020.09.06 |
HINSTANCE 타입과 HWND 타입의 차이 (0) | 2020.06.12 |
윈도우의 메시지 처리 과정 (0) | 2020.04.02 |
4. WinMain: The application entry point (0) | 2020.03.31 |
댓글