在 Windows 操作系统里,当窗口显示之后,它就可以接收到系统源源不断地发过来的消息, 然后窗口就需要处理这些消息,因此就需要一个函数来处理这些消息。在 API 里定义了一 个函数为回调函数,当系统需要向窗口发送消息时,就会调用窗口给出的回调函数 WindowProc,如果 WindowProc 函数不处理这个消息,就可以把它转向 DefWindowProc 函数来处理,这是系统的默认消息处理函数。当你按下菜单,或者点击窗口时,窗口需要运 行这个消息处理函数。函数 WindowProc 声明如下:
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg,
WPARAM wParam,
LPARAM lParam);
- hwnd 是当前窗口的句柄。
- uMsg 是系统发过来的消息。
- wParam 是消息参数。
- lParam 是消息参数。
函数 DefWindowProc 声明如下:
LRESULT DefWindowProc(HWND hWnd, UINT Msg,
WPARAM wParam,
LPARAM lParam);
这个函数参数跟上面那个函数是一样的。只不过,它是处理所有默认的消息。
调用这两个函数的实例如下:
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_EX IT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
//
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
- 第 1行定义消息处理函数。
- 第 7行开始根据不同的消息作处理。
- 第 22行和第34 行都是调用 DefWindowProc 函数来处理未处理的消息。
有了窗口消息处理函数,就可以响应不同的消息,实现各种各样的功能。