DefWindowProc处理哪些消息?

时间:2010-06-04 12:10:08

标签: windows winapi wndproc

是否有任何文档由DefWindowProc处理哪些消息,以及如何处理?

我最近偶然发现WM_SETFONT / WM_GETFONT没有被处理,我不确定我的代码是否有错,或者是否是预期的行为,所以我尝试了下面的WinMain:


   WNDCLASSEX wcx =
   {
      sizeof(WNDCLASSEX),
      CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, 
      DefWindowProc,
      0, 0,  // class/wnd extra bytes
      hInstance, 
      0,  
      LoadCursor(0, IDC_ARROW),
      0, 
      0,
      _T("some class"),
      0
   };

   ATOM a = RegisterClassEx(&wcx);
   _ASSERTE(a != 0);

   HWND wnd = CreateWindowEx(0, wcx.lpszClassName, NULL, 
                   WS_POPUP, 0,0,0,0, GetDesktopWindow(), 0, hInstance, 0);
   _ASSERTE(wnd != 0);

   HFONT font = (HFONT) GetStockObject(ANSI_VAR_FONT);
   _ASSERTE(font != 0);

   SendMessage(wnd, WM_SETFONT, (WPARAM) font, 0);
   HFONT font2 = (HFONT) SendMessage(wnd, WM_GETFONT, 0, 0);

   _ASSERTE(font2 == font);  // **FAILS**, font2 is 0

1 个答案:

答案 0 :(得分:5)

据我所知 - 没有。 每个窗口消息都是罕见且独特的,可以通过多种方式之一进行区分。预计会发布一些消息,其他消息将被发送。

某些消息是对用户窗口proc的通知,其他消息是对DefXXXWindowProc处理程序的命令--DefWindowProc,DefDlgProc,DefMDIChildProc等。

有些在对话框和窗口过程中处理相同,有些必须以不同的方式处理。

WM_SETTEXT和WM_SETREDRAW实际上是DefWindowProc用来修改WND结构中内部数据结构的命令。

WM_SIZE只是一个通知 - 发送BY DefWindowProc到它自己的窗口 - 响应WM_WINDOWPOSCHANGED。

WM_MOUSExxx消息需要发布,永不发送,因为Windows经常进入模态状态,其中使用GetMessage / PeekMessage读取消息并直接处理而不发布。

许多消息看起来像通知,但必须始终传递给DefWindowProc,因为它们“秘密”用于实现窗口管理器。 (WM_ACTIVATE和朋友)。

大多数消息可以通过返回FALSE(或TRUE)在对话框proc中处理,有些,有意义的结果需要使用SetDlgResult,其他的会自动处理(WM_CTLCOLOR *),因为对话框proc 知道 DialogProc的非零结果对应于要返回的LRESULT。

有些(WM_SYSCOMMAND)根本不是窗口的消息,只是由DefWindowProc处理来做窗口管理器类型的东西(平铺桌面等)。

官方文档中没有真正尝试对这些差异进行分类。


为了专门解决WM_SET/GETFONT问题,WM_SETFONT虽然定义的消息不由DefwindowProc处理,因此不由未明确支持它的窗口类处理。控件(编辑,静态等)和对话支持WM_SETFONTWM_GETFONT。要在应用程序注册类中支持它,需要提供实际的自定义WindowProc并在那里处理消息。