LRESULT CallWindowProc(WNDPROC lpPrevWndFunc,HWND hWnd.UINT Msg,WPARAM wParam,LPARAMIParam);
函数功能, CallWindowProc将指定消息信息传送给指定的窗口过程. lpPrevWndFunc是窗口消息处理函数指针(函数名), hWnd为接受窗体句柄.
DefWindowProc(HWND hWnd.UINT Msg,WPARAM wParam,LPARAMIParam), 是让Windows的缺省消息处理函数处理消息.
函数功能:该函数调用缺省的窗口过程来为应用程序没有处理的任何窗口消息提供缺省的处理。该函数确保每一个消息得到处理。调用DefWindowProc函数时使用窗口过程接收的相同参数。
二者关键的区别有, CallWindowProc 是发送某个消息给某个处理函数(包括自定义消息处理函数), 而DefWindowProc 是发送某个消息给Windows缺省(内定)的消息处理函数.
如果理解了他们这一点的区别, 就能明白,
CalWindowPro(DefWindowProc, hWnd,Msg,wParam, lParam) 和
DefWindowProc(hWnd,Msg ,wParam,lParam);二者此时执行效果一样
在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函数来处理未处理的消息。
有了窗口消息处理函数,就可以响应不同的消息,实现各种各样的功能。