[VC]WindowProc和DefWindowProc函数
在Windows操作系统里,当窗口显示之后,它就可以接收到系统源源不断地发过来的消息,然后窗口就需要处理这些消息,因此就需要一个函数来处理这些消
息。在API里定义了一个函数为回调函数,当系统需要向窗口发送消息时,就会调用窗口给出的回调函数WindowProc,如果WindowProc函数
不处理这个消息,就可以把它转向DefWindowProc函数来处理,这是系统的默认消息处理函数。当你按下菜单,或者点击窗口时,窗口需要运行这个消
息处理函数。
函数WindowProc声明如下:
LRESULT CALLBACK
WindowProc( HWND
hwnd,
UINT uMsg,
WPARAM
wParam,
LPARAM
lParam
);
hwnd是当前窗口的句柄。
uMsg是系统发过来的消息。
wParam是消息参数。
lParam是消息参数。
这个函数一定是静态函数,也就是全局函数,在编译时已经确定了地址。由于它需要设置在注册的窗口类型里,如下:
#008 ATOM
MyRegisterClass(HINSTANCE hInstance)
#009 {
#010 WNDCLASSEX
wcex;
#011
#012 wcex.cbSize = sizeof(WNDCLASSEX);
#013
#014
wcex.style
= CS_HREDRAW | CS_VREDRAW;
#015 wcex.lpfnWndProc =
WndProc;
第15行就是设置窗口的消息处理函数。
函数DefWindowProc声明如下:
LRESULT
DefWindowProc( HWND
hWnd,
UINT Msg,
WPARAM
wParam,
LPARAM
lParam
);
这个函数参数跟上面那个函数是一样的。
只不过,它是处理所有默认的消息。
调用这两个函数的实例如下:
#001 // #002 // 函数: WndProc(HWND, UINT, WPARAM, LPARAM) #003 // #004 // 目的: 处理主窗口的消息. #005 // #006 // 蔡军生 2007/07/12 #007 // #008 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) #009 { #010 int wmId, wmEvent; #011 PAINTSTRUCT ps; #012 HDC hdc; #013 #014 switch (message) #015 { #016 case WM_COMMAND: #017 wmId = LOWORD(wParam); #018 wmEvent = HIWORD(wParam); #019 // 菜单选项命令响应: #020 switch (wmId) #021 { #022 case IDM_ABOUT: #023 DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); #024 break; #025 case IDM_EXIT: #026 DestroyWindow(hWnd); #027 break; #028 default: #029 return DefWindowProc(hWnd, message, wParam, lParam); #030 } #031 break; #032 case WM_PAINT: #033 hdc = BeginPaint(hWnd, &ps); #034 // #035 EndPaint(hWnd, &ps); #036 break; #037 case WM_DESTROY: #038 PostQuitMessage(0); #039 break; #040 default: #041 return DefWindowProc(hWnd, message, wParam, lParam); #042 } #043 return 0; #044 }
第8行定义消息处理函数
第14行开始根据不同的消息作处理。
第29行和第41行都是调用DefWindowProc函数来处理未处理的消息。
有了窗口消息处理函数,就可以响应不同的消息,实现各种各样的功能。