3

是否有任何文档由 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
4

1 回答 1

5

据我所知 - 不。每个窗口消息都是一种罕见且独特的东西,可以在许多方面有所不同。一些消息预计会发布,其他消息会发送。

一些消息是给用户窗口 proc 的通知,另一些是给 DefXXXWindowProc 处理程序的命令 - DefWindowProc、DefDlgProc、DefMDIChildProc 等。

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

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

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

WM_MOUSExxx 消息需要发布,从不发送,因为窗口经常进入模式状态,其中消息通过 GetMessage/PeekMessage 读取并直接处理而不发布。

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

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

有些(WM_SYSCOMMAND)根本不是真正的窗口消息,只是由 DefWindowProc 处理以执行窗口管理器类型的事情(平铺桌面等)

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


为了专门解决这个WM_SET/GETFONT问题,WM_SETFONT虽然是定义的消息,但 DefwindowProc 不处理,因此不明确支持它的窗口类不处理。控件(EDIT、STATIC 等)和对话框支持WM_SETFONTWM_GETFONT. 要在应用程序注册类中支持它,需要提供一个实际的自定义 WindowProc 并在那里处理消息。

于 2010-06-04T15:26:46.170 回答