메시지 처리 함수란 메시지가 발생할 때 프로그램의 반응을 처리하는 일을 하며 WinMain 함수와는 별도로 WndProc(Window Procedure)이라는 이름으로 존재한다. 

 

WinMain 내의 메시지 루프는 메시지를 메시지 처리 함수로 보내주기만 할 뿐이며 WndProc은 메시지가 입력되면 윈도우즈에 의해 호출되어 메시지를 처리한다. 이렇게 운영체제에 의해 호출되는 응용 프로그램 내의 함수콜백(Callback)함수라고 한다.

 

WndProc의 인수는 모두 4개이며 이전 글에서 봤던 MSG 구조체의 멤버 4개와 동일하다.

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

<WndProc>

hWnd : 메시지를 받을 윈도우의 핸들

iMessage : 어떤 변화가 발생했는가에 관한 정보. (메시지 변수)

wParam, IParam : iMessage에 따른 부가적인 정보 (어디쯤에서 마우스 버튼이 눌렸는가, 어떤 문자열이 입력됐는가,,)

 

WndProc의 구조는 아래와 같다. 메시지의 종류에 따라 다중 분기하여 메시지별로 처리를 진행한다.

switch(iMessage)
{
	case Msg1:
		처리1;
		return 0;
	case Msg2:
		처리2;
		return 0;
	case Msg3:
		처리3;
		return 0;
	default:
		return DefWindowProc(...);
}

마지막에 DefWindowProc 함수는 WndProc에서 처리하지 않은 나머지 메시지에 관한 처리를 해 준다.

 

이전 글의 코드에서의 메시지 처리 함수는 아래와 같이 되어 있다.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	switch(iMessage) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

여기서는 WM_DESTROY 메시지만을 처리하고 있으며 나머지 메시지에 대해서는 DefWindowProc에게 맡긴다.

WM_DESTROY 외의 메시지는 모든 DefWindowProc 함수로 전달되며 이 함수에서 디폴트 처리를 수행해 준다. 

WndProc은 메시지를 처리했을 경우 반드시 0을 리턴해 주어야 한다.

또한 DefWindowProc 함수가 메시지를 처리했을 경우 이 함수가 리턴한 값을 WndProc 함수가 다시 리턴해 주어야 한다. 

 

 

'Project > WIN32 API' 카테고리의 다른 글

그래픽 오브젝트  (0) 2021.07.12
그래픽  (0) 2021.07.08
리소스  (0) 2021.07.07
윈도우 창 생성 과정  (0) 2021.06.25
윈도우즈 프로그래밍  (0) 2021.06.25

+ Recent posts