CallWindowProc与DefWindowProc的区别

 

LRESULT CallWindowProcWNDPROC lpPrevWndFuncHWND hWndUINT MsgWPARAM wParamLPARAMIParam);
函数功能, CallWindowProc将指定消息信息传送给指定的窗口过程. lpPrevWndFunc是窗口消息处理函数指针(函数名), hWnd为接受窗体句柄.
DefWindowProc(HWND hWnd
UINT MsgWPARAM wParamLPARAMIParam), 是让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函数来处理未处理的消息。

有了窗口消息处理函数,就可以响应不同的消息,实现各种各样的功能。

你可能感兴趣的:(windows,api,command,callback)