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);