본문 바로가기

[ C/ C++ 프로그래밍 ]/[ WinAPI ]

[Windows Api 정복 정리 ] 메시지 루프


ㅇ 윈도우즈 시스템
  - 윈도우즈를 메시지 구동 시스템(Message Driven System)이라고 함 , 도스와 윈도우의 차이점
  - 윈도우즈는 메시지(상황)에 따라 실행 순서가 달라짐 , 도스는 미리 입력된 순차적 실행
 
 ㅇ 메시지
  - 사용자나 시스템 내부적인 동작에 의해 발생된 일체의 변화에 대한 정보
     ex) 마우스 버튼클릭
  - 메시지가 발생하면 프로그램에서는 메시지가 어떤 정보를 담고 있는가를 분석하여 어떤 루틴을 호출 할것인가를 결정
 
ㅇ 메시지 루프
  - 윈도우 프로그램에서 메시지를 처리하는 부분을 메시지 루프라고 함
  - 보통 WinMain 함수의 끝에 다음과 같은 형식으로 존재

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

 - 세개의 함수 호출로 이루어져 있다
 

ㅇ GetMessage

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

 - 시스템이 유지하는 메시지 큐에서 메시지를 읽어 들인다.
 - 읽은 메시지는 첫번째 인수가 지정하는 MSG 구조체에 저장된다.
 - 메시지가 WM_QUIT일 경우 False를 리턴(프로그램 종료), 그 외의 메시지 True를 리턴
 - 나머지 세게의 인수는 메시지의 범위를 지정하는 데 사용
 
ㅇ TranslateMessage
 
BOOL TranslateMessage( CONST MSG *lpMsg);

- 키보드 입력 메시지를 가공해 준다.
- 키보드의 어떤 키가 눌려졌거나 떨어졌을 경우  키보드 메시지를 발생시킨다 
    ==> WM_KEYDOWN , WM_KEYUP가 연속적으로 발생할 때 메시지(WM_CHAR )를 만드는 역할 
  ex) A키를 눌렸다가 때면 A문자가 입력되었는 메시지를 만든다.

ㅇ DispatchMessage

NG DispatchMessage( CONST MSG *lpmsg);
 - 시스템 메시지 큐에서 꺼낸 메시지를 프로그램의 메시지 처리 함수(WndProc)로 전달
 - 이 함수에 의해 메시지가 프로그램으로 전달된다.

※ 메시지 루프가 하는 일은  WM_QUIT 메시지가 전달뙬때까지 반복하면서 메시지를 꺼내고, 필요한 경우 약간 형태를 바꾼 후 응용 프로그램으로 전달하는 것
    실제 처리는 메시지 처리 함수(WinProc)가 한다.


ㅇ MSG 구조체

typedef struct tagMSG
{
    HWND        hwnd;   /// 메시지를 받은 윈도우 핸들
    UINT         message; /// 어떤 종류의 메세지가를 나타냄, 가장 중요
    WPARAM      wParam; /// 전달된 메시지에 대한 부가적인 정보, 의미는 메시지 마다 다름 32비트값
    LPARAM       lParam; /// 전달된 메시지에 대한 부가적인 정보, 의미는 메시지 마다 다름 32비트값
    DWORD        time;  /// 메시지가 발생한 시간
    POINT        pt;  /// 메시지가 발생했을때 마우스의 위치
} MSG;  


ㅇ 자주 사용되는 메시지

 - WM_QUIT   :  프로그램 종료될때
 - WM_LBUTTONDOWN :  마우스 왼쪽 버튼 클릭
 - WM_CHAR   :  키보드로 부터 문자가 입력될때
 - WM_PAINT   :  화면을 다시 그려야 할때
 - WM_DESTROY  : 윈도우가 메모리에서 파괴될때
 - WM_CREATE   :  윈도우가 처음 만들어질때

※ 메시지 루프가 종료되면 프로그램은 마지막으로 Message.wParam을 리턴하고 종료한다. 이 값은 WM_QUIT 메시지로부터 전달된 탈출 코드(exit code)이다. 


 ps : 자세한 내용은  www.WinAPI.co.kr 참고