WinAPI: 메시지 루프

1. 메시지 구동 시스템
 Windows를 메시지 구동 시스템이라고 하며 도스와 가장 뚜렷한 대비를 이루는 특징입니다. 도스는 입력된 명령들을  순서대로 실행하는 순차적 실행방법을 사용하지만, Windows는 상황에 따라 실행 순서가 달라집니다. 상황은 어떤 메시지가 주어졌는가를 말합니다.

 메시지란 사용자나 시스템 내부적인 동적에 의해 발생된 일체의 변화에 대한 정보를 말합니다. 메시지가 발생하면 프로그램에서는 정보를 분석하여 어떤 루틴을 호출할 것인가를 결정합니다. 보통 WinMain 함수의 끝에는 다음과 같은 형식으로 루프가 있습니다.

while(GetMessage(&Message,0,0,0))
{
    TranslateMessage(&Message);
    DispatchMessage(&Message);
}

2. GetMessage 함수
BOOL GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);

 이 함수는 시스템이 유지하는 메시지 큐에서 메시지를 읽어들입니다. 메시지는 lpMsg에 저장됩니다. 이 함수는 메시지가 WM_QUIT일 경우 False를 반환하고 그 외의 메시지는 True를 반환합니다. 나머지 세 개의 인수는 읽어들일 메시지의 범위를 지정하는데 잘 사용되지 않습니다.

3. TranslateMessage 함수
BOOL TranslateMessage(CONST MSG *lpMsg);

  키보드 입력 메시지를 가공하여 프로그램에서 쉽게 쓸 수 있도록 해 줍니다. WM_KEYDOWN과 WM_KEYUP이 연속적으로 발생할 때 WM_CHAR라는 문자가 입력되는 메시지를 만드는 역할을 합니다.

4. DispatchMessage 함수
LONG DispatchMessage(CONST MSG *lpMsg);

 시스템 메시지 큐에서 꺼낸 메시지를 프로그램의 메시지 처리 함수(WndProc)로 전달합니다. 이 함수에 의해 메시지가 프로그램으로 전달되며 프로그램에서는 메시지를 점검하여 다음 동작을 결정합니다.

5. MSG 구조체
 메시지 처리는 WndProc 함수에서 수행합니다. 메시지는 시스템의 변화에 대한 정보이며 MSG라는 구조체에 보관됩니다. 다음은 MSG 구조체의 정의입니다.

typedef struct tagMSG
{
    HWND hwnd;
    UINT message;
    WPARAM wParam;
    LPARAM lParam;
    DWORD time;
    POINT pt;
} MSG;

1) hwnd : 메시지를 받을 윈도우 핸들입니다.
2) message : 어떤 종류의 메시지인가를 나타냅니다.
3) wParam, lParam : 전달된 메시지에 대한 부가적인 정보를 가집니다. 32비트값입니다.
4) time : 메시지가 발생한 시간입니다.
5) pt : 메시지가 발생했을 때의 마우스 위치입니다.

message 멤버를 읽어 메시지의 종류를 파악하며 프로그램의 반응이 달라집니다. GetMessage 함수는 읽은 메시지를 MSG형의 구조체에 대입해주며 이 구조체는 DispatchMessage 함수에 의해 WndProc 함수로 전달됩니다.

6. 메시지 종류
 메시지는 하나의 정수값으로 표현되는데 메시지의 종류가 너무 많아서 windows.h에 메시지별로 매크로 상수를 정의해 두었습니다. 다음은 자주 사용되는 메시지들입니다.

WM_QUIT 프로그램을 끝낼 때 발생합니다.
WM_LBUTTONDOWN 마우스의 좌측 버튼을 누를 경우 발생합니다.
WM_CHAR 키보드로부터 문자가 입력될 때 발생합니다.
WM_PAINT 화면을 다시 그려야 할 필요가 있을 때 발생합니다.
WM_DESTROY 윈도우가 메모리에서 파괴될 때 발생합니다.
WM_CREATE 윈도우가 처음 만들어질 때 발생합니다.

댓글