최호성님의 VISUAL C++ 2008 MFC 윈도우 프로그래밍을 학습한 뒤 정리한 내용입니다.
윈도우 프로시저 함수는 특정 윈도우 메시지에 대해 개발자가 자신의 코드를 작성하는 영역이라 할 수 있습니다.
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // 메뉴 선택을 구문 분석합니다. switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: 여기에 그리기 코드를 추가합니다. EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
WndProc() 함수의 기본원리는 WM_COMMAND, WM_PAINT, WM_DESTROY 윈도우 메시지에 대해서 처리를 하고 나머지 메시지에 대해서는 윈도우 운영체제가 알아서 하도록 DefWindowProc() 함수를 호출하고 있습니다.
윈도우 메시지는 저마다 고유의 특징과 의미를 갖고 있으며 윈도우 프로그램에서 작동하는 모든 것은 메시지로 처리됩니다. 메시지가 전달뙬 때는 단지 메시지만 전달되는 것이 아니라 처리에 필요한 다양한 정보를 함께 전달합니다. 이 정보는 wParam, lParam 파라미터에 담겨있습니다.
WM_COMMAND 메시지는 프로그램의 메뉴를 선택하거나 버튼을 누를 때 발생합니다. 하지만 메시지 자체만으로는 어떤 메뉴와 어떤 버튼을 눌렀는지 알 수 없고 이 정보는 파라미터에 포함이 되어 있습니다.
WM_PAINT 메시지는 윈도우를 다시 그려야할 때 발생합니다. 윈도우가 최소화되었다가 커지거나 화면에서 사라졌다 다시 나오는 경우 등에 사용됩니다.
WM_DESTROY 메시지는 윈도우를 종료할 때 발생합니다. 사용자가 닫기 버튼이나 메뉴의 종료를 선택했을 때 발생하며 DestroyWindow() 함수를 호출하여 윈도우를 소멸하는 시점입니다. 코드에서는 PostQuitMessage() 함수를 호출하는데 이 함수가 메시지 큐에 WM_QUIT 메시지를 전송하는 역할을 합니다.