최호성님의 VISUAL C++ 2008 MFC 윈도우 프로그래밍을 학습한 뒤 정리한 내용입니다.
메인 메시지 루프 코드 중에서 TranslateAccelerator() 함수는 액셀러레이터 키 테이블과 직접적으로 관련이 있습니다. 키 조합을 통한 입력시 이를 특정 메뉴의 선택으로 메시지 전환이 일어나면서 프로그램이 동작하도록 합니다.
GetMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax )
GetMessage() 함수의 원형은 위와 같습니다. GetMessage() 함수는 응용 프로그램의 메시지 큐를 검사하여 전달받은 메시지가 있는지 확인합니다.
GetMessage() 함수의 인자
- lpMsg MSG구조체의 포인터가 들어가며 메시지 큐에 메시지가 있을 시 내용을 복사
- hWnd 윈도우 핸들을 정의
- wMsgFilterMin, wMsgFilterMax 받고자 하는 메시지의 범위를 명시
윈도우 메시지란 결국 어떤 숫자에 불과한 것으로 원한다면 숫자를 한정하여 원하는 메시지만 받을 수 있습니다. 하지만 일반적으로 그렇게 하지는 않기 때문에 wMsgFilterMin, wMsgFilterMax 이 두 값은 보통 0이 됩니다. GetMessage()는 0 아니면 1을 반환하는 0은 WM_QUIT 메시지를 받은 경우에 반환합니다.
TranslateMessage() 함수는 특정 메시지를 전환하는 함수입니다. 대표적 예로 WM_KEYDOWN 메시지가 입력되었을 때, 눌린 키가 문자 키나 숫자키인 경우 WM_CHAR로 변경됩니다. 이를 통해 개발자는 사용자가 글씨를 입력했다는 것을 알 수 있습니다.
DispatchMessage() 함수는 내부적으로 윈도우 프로시저 함수를 호출합니다. 이 함수의 의미는 응용 프로그램이 메시지 드리븐 방식으로 동작하는 것이며 이는 개발자가 바꿀 수 있는 것은 아니지만 발생한 메시지에 대한 모든 처리는 개발자가 얼마든지 바꿀 수 있다는 것입니다. 즉 응용 프로그램의 코드 대부분은 윈도우 프로시저 함수에 집중되기 마련이며, DispatchMessage() 함수는 윈도우 운영체제와 개발자의 코드를 서로 연결하는 가교 역할을 합니다.