메시지 처리 함수(WndProc)

|

API시작 시

두개의 함수만 있는데


하나는 프로그램의 시작인 WinMain이고

또 하나는 WndProc이다.


도스에서는 main함수 만으로도 프로그램을 작성할 수 있지만

WinAPI에서는 아주 특별한 경우를 제외하고는 이 두개의 함수가 모두 있어야 한다.


- WinMain에서는 윈도우를 만들고 화면에 출력하기만 할 뿐이며 대부분의 일은 WndProc에서 이루어진다.

- WinMain의 모양은 대체로 일정하며 특별한 일을 하지 않지만 WndProc는 프로그램에 따라 천차만별로 달라진다.

- 그래서 소스를 분석할 때 주의깊게 봐야 할 부분은 WinMain이 아니라 WndProc이다. WinMain 바로 윗부분에 WndProc 함수의 원형이 선언되어 있다.


LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );


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

- WinMain내의 메시지 루프는 메시지를 메시지 처리 함수로 보내주기만 할 뿐이며 WndProc은 메시지가 입력되면 윈도우즈에 의해 호출되어 메시지를 처리한다.

이렇게 운영체제에 의해 호출되는 응용 프로그램내의 함수를 콜백(CallBack) 함수라고 한다.


WndProc의 인수를 살펴보도록 하자.

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

- UINT 메세지의 종류는 무엇인가.

ex) WM_MOVE면 윈도우의 위치가 변경되었다. WM_DESTROY면 윈도우가 파괴되었다.


wParam, lParam은 UINT의 메세지에 따른 부가적인 정보를 가진다.

예를들어 마우스 우측 버튼이 눌러졌을 때 WM_LBUTTONDOWN라는 메세지가 입력되었다면,

- 화면 어디쯤에서 마우스 버튼이 눌러졌는가.

- 키보드 상황은 어떤가 (Shift, Ctrl, Alt)

- WM_CHAR 메시지, 즉 키보드로부터 키가 입력되었다는 메시지가 입력되었다면 어떤 키가 입력되었는가.


에 대한 추가적인 정보들이 wParam, lParam으로 전달된다.

wParam, lParam에 실제로 어떤 값을 전달되는지는 메시지별로 다르다.



제일 끝에 있는 DefWindowProc 함수는 WndProc에서 처리하지 않은 나머지 메시지에 관한 처리를 해 준다. 예를 들어 시스템 메뉴를 더블 클릭하면 프로그램이 종료되는데 이런 처리는 별도로 해 주지 않아도 DefWindowProc 함수에서 해 준다. 그래서 윈도우의 이동이나 크기변경 따위의 처리는 직접 해 줄 필요없이 DefWindowProc으로 넘겨주기만 하면 된다.


return DefWindowProc(hWnd, uMsg, wParam, lParam);

'API > 이론' 카테고리의 다른 글

메시지 루프  (0) 2016.04.13
윈도우 클래스  (0) 2016.04.13
Main함수 비교  (0) 2016.04.12
헤더파일  (0) 2016.04.12
윈도우 창 만들기.  (0) 2016.04.11
And