본문 바로가기

전자 공학/MFC

[MFC 독학하기] 4. GetMessage TranslateMessage DispatchMessage Wndproc

반응형

안녕하세요. 취업한 공대누나입니다.

요즘은 주말마다 MFC를 조금씩 공부하고 있는데요.

이번주도 열심히 해보겠습니다.

가장 흔히 있는 HelloSDK의 예제를 분석하고 있습니다.

사용중인 함수들에 대한 이해를 해보는 중이며 내용 공유를 해보겠습니다.

 

 

1. GetMessage 

GetMessage 함수는 메시지 큐에서 메시지 하나를 꺼내 msg 변수에 저장을 하는 것입니다.

WndProc 콜백 함수에서 메시지가 있을 때는 WM_QUIT을 제외한 모든 메시지에 대해서 1을 돌려줍니다.

그리고 꺼낸 메시지가 WM_QUIT이면 0을 리턴하면서 거짓으로 판단하고 while 문을 빠져나갑니다.

새 메시지가 올때까지 제어가 필요없어서 CPU를 사용하지 않습니다.

 

2. TranslateMessage

GetMessage는 메시지 큐에서 메시지를 꺼내온 후 이 메시지를 TranslateMessage 함수에 넘겨줍니다.

TranslateMessage 함수는 msg 변수에 키보드 메시지가 들어 있을 경우 키에 대응하는 문자를 만들어냅니다.

전달된 메시지가 WM_KEYDOWN인지와 눌려진 키가 문자키인지 검사하고 조건이 맞을 경우 WM_CHAR 메시지를 만들어서 메시지 큐에 덧붙입니다.

 

3. DispatchMessage

DispatchMessage 함수는 메시지를 윈도우 프로시저로 보냅니다.

 

즉 GetMessage 함수가 메시지를 읽고 TranslateMessage가 문자 메시지로 변환을 하고 DispatchMessage가 메시지를 우니도우 프로시저로 보내는 것입니다.

 

 

4. 윈도우 프로시저

윈도우 메시지를 처리하는 핵심 함수 WndProc를 말합니다.

WinMain에서 호출하는 것이 아니라 운영체제에 의해서 호출이 됩니다. 

 

윈도우 프로시저 함수는 콜백 함수(CallBack)함수 입니다.

메시지가 입력되면 윈도우에 의해 호출되어 메시지를 처리하는 것을 말합니다.

 

인수는 모두 4개가 있습니다.

한 개의 윈도우 클래스를 기반으로 윈도우를 여러 개 생성할 경우, 모든 윈도우가 윈도우 프로시저를 공유하게 되므로

어느 윈도우에서 메시지가 발생했는지 구분할 필요가 있고 hwnd가 그 역할을 하게 됩니다.

message는 발생한 메시지 종류를 나타내며 WM_으로 시작하는 상수값입니다.

wParam과 lParam은 메시지 종류에 따라 부가 정보를 전달하는 32비트 값입니다.

 

WM_CREATE CreateWindow() 함수를 호출할 때
WM_LBUTTONDOWN 클라이언트 영역에서 마우스 왼쪽 버튼을 누를 때
WM_PAINT 클라이언트 영역의 일부 또는 전체를 다시 그릴 필요가 있을 때
WM_DESTROY 윈도우 종료 버튼을 클릭할 때

WM_CREATE는 윈도우를 생성하는 CreateWindow(Ex) 함수를 호출하면 전달되는 메시지이다.

메모리에 윈도우를 생성한 후 화면에 보이기 전에 보내지게됩니다.

 

WM_LUBTTONDOWN는 마우스 왼쪽 버튼을 누를 때 발생합니다.

wParam과 lParam에 마우스/키보드 버튼의 상태와 마우스 커서의 위치가 저장되어 있습니다.

 

WM_PAINT 메시지를 처리할 때는 BeginPaint()와 EndPaint() 함수를 시작 부분과 끝부분에서 호출해야합니다.

이 두 함수는 응용 프로그램이 메시지에 응답하여 윈도우의 클라이언트 영역을 다시 그렸음을 운영체제에 알려줍니다.

WM_PAINT 메시지를 받았을 때 화면을 다시 그려주지 않으면 윈도우의 최소화/최대화를 비롯한 크기 변경, 다른 윈도우가 클라이언트 영역을 가렸다가 다시 보이게 되는 등이 발생할 때 화면의 내용이 지워지는 현상이 발생하게 됩니다.

 

WM_DESTROY는 메시지 처리의 마지막 단계로 PostQuitMessage() 함수를 호출합니다.

PostQuitMessage는 응용 프로그램 메시지 큐에 WM_QUIT 메시지를 집어넣습니다.

 

DefWindowPrco 함수는 WndProc에서 처리하지 않은 나머지 메시지에 관한 처리를 합니다.

 

 

 

 

새로운 시스템을 공부 하는 중이라고 해야할까요?

처음 해보는 공부 과정이라서 어렵기도 하지만 재미있습니다.

어릴 때는 그렇게 공부하기가 싫었는데 이제는 공부하는 것도 하나의 취미가 된 것 같아요.

 

반응형