윈도우즈를 메시지 구동 시스템(Message Driven System)이라고 하는데 윈도우즈는 미리 입력된 일련의 명령들을 순서대로

실행하는 것이 아니라 프로그램의 실행 순서가 명확하게 정해져 있지 않으며 상황에 따라 실행 순서가 달라지는데 여기서 말하

는 상황이란 바로 어떤 메시지가 발생했는가를 의미한다.
 
메시지란 사용자나 시스템의 내부적인 동작에 의해 발생된 정보이다. 예를 들면, 마우스 버튼을 클릭했다거나 키보드를 눌렀다

거나 윈도우가 최소화되었다거나 하는 변화에 대한 정보들이 메시지이다.

 윈도우 프로그램에서 메시지를 처리하는 부분을 메시지 루프(Message Loop)라고 하며 보통 WinMain 함수의 끝에 다음과

같은 형식으로 존재한다.

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


위와 같이 메시지 루프는 세 개의 함수 호출로 이루어져 있으며, 전체 루프는 while문으로 싸여져 있어 무한 반복된다.

그럼 각 함수의 역할을 알아보자...

BOOL GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);

 이 함수는 메시지 큐에서 메시지를 읽어들인다. 메시지 큐는 시스템이나 사용자로 부터 발생된 메시지가 잠시 대기하는 저장

공간으로 이 함수는 읽어들인 메시지가 프로그램을 종료하라는 WM_QUIT일 경우 FALSE를 리턴하며 그 외의 메시지이면

TRUE를 리턴한다.

BOOL TranslateMessage(CONST MSG *lpMsg);

 이 함수는 키보드 입력 메시지를 가공하여 프로그램에서 쉽게쓸 수 있도록 한다. 어떤 키가 눌러지거나 떨어졌을 때 키보드 메

시지를 발생시키는데 TranslateMessage 함수는 WM_KEYDOWN 메시지가 발생할 때 마다 문자가 입력되었다는 메시지

(WM_CHAR)를 만드는 역할을 한다.

LONG DisPatchMessage(CONST MSG *lpmsg);

이 함수는 메시지 큐에서 꺼낸 메시지를 윈도우의 메시지 처리 함수(WndProc) 로 전달한다.


메시지 루프의 세 함수는 공통적으로 MSG 라는 구조체를 사용하는데 이 구조체는 다음과 같이 정의되어 있다.

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

각 멤버의 의미는...

hwnd : 메시지를 받을 윈도우 핸들이다.
message : 어떤 종류의 메시지인가를 나타낸다. 가장 중요한 값이다.
wParam : 전달된 메시지에 대한 부가적인 정보를 가진다. 어떤 의미를 가지는가는 메시지별로 다르다. 32bit 값.
lParam : 전달된 메시지에 대한 부가적인 정보를 가진다. 어떤 의미를 가지는가는 메시지별로 다르다. 32bit 값.
time : 메시지가 발생한 시간이다.
pt : 메시지가 발생했을 때의 마우스 위치이다.

'프로그래밍 > API' 카테고리의 다른 글

[API] DC ( Device Context ) 란..........  (0) 2011.08.03
[API] 커서 바꾸기..  (0) 2011.08.03
[API] 윈도우 생성..  (0) 2011.08.02
[API] 윈도우 클래스  (0) 2011.08.01
[API] 유니코드  (0) 2011.07.31
Posted by 바람처럼..
|