曲径通幽论坛

标题: DefWindowProc() -- 默认窗口处理函数 [打印本页]

作者: beyes    时间: 2012-2-7 02:15
标题: DefWindowProc() -- 默认窗口处理函数
DefWindowProc() 函数原型如下:
[C++] 纯文本查看 复制代码
LRESULT DefWindowProc( 
  HWND hWnd,
  UINT Msg,
  WPARAM wParam,
  LPARAM lParam
);

通常窗口会收到许多消息,但是消息处理函数不一定要每个都需要处理,有些消息可能只需要直接让系统来处理即可。DefWindowProc() 的作用就是处理窗口消息处理函数没有处理完,或者不需要处理的函数。实际上许多程序员没有关注的消息都是由该函数来处理的。如果在消息处理函数中不把消息交给 DefWindowProc() 来处理,那么对窗口的动作几乎不会有响应,包括窗口的移动,关闭,甚至许多窗口的样式都不能显示。

一般情况下,除非一个消息不再需要 DefWindowProc() 来处理,那么最好还是将没有处理的消息统一交由它来处理。

比如在一个程序中,WinMain() 里仅创建 DialogBoxParam()  函数来生成一个对话框,比如如下使用:
DialogBoxParam (hInstance, MAKEINTRESOURCE(IDD_MAINDLG), NULL, MainDlg, NULL);
其中 MainDlg() 就是对话框处理函数,在该函数中,我们处理了 WM_INITDIALOG 初始化对话框消息,如:
case WM_INITDIALOG:
        SendMessage(hDlg,WM_SETICON,ICON_BIG,LPARAM(LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON1)))); //设置图标
其中,使用了 SendMessage() 函数直接向对话框发送 WM_SETICON 消息,根据 MSDN 中对 SendMessage() 函数的描述:
SendMessage calls the window procedure for the specified window and does not return until the window procedure has processed the message.
上面所述的意思是:SendMessage() 调用窗口处理程序来处理指定的窗口并且知道窗口处理程序处理完消息后才会返回。
这里,由于我们不在上述的程序中显示定义 WM_SETICON 消息的窗口处理函数,那么 SendMessage() 函数所调用的窗口处理函数即是 DefWindowProc() 。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2