代码之家  ›  专栏  ›  技术社区  ›  peterchen

defwindowproc处理哪些消息?

  •  3
  • peterchen  · 技术社区  · 15 年前

    是否有文档说明哪些消息由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 回复  |  直到 14 年前
        1
  •  5
  •   Chris Becke    14 年前

    据我所知-不。 每一个窗口消息都是一个罕见和独特的东西,可以在许多方面有所不同。有些消息需要发布,另一些则需要发送。

    一些消息是对用户window proc的通知,其他消息是对defxxxwindowproc处理程序的命令-defwindowproc、defdlgproc、defmdichildproc等。

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

    wm_settext和wm_setredraw实际上是defwindowproc用来修改wnd结构中内部数据结构的命令。

    wm_大小只是一个通知-由defwindowproc发送到它自己的窗口-响应wm_windowposchanged。

    wm_mousexx消息需要发布,而不是发送,因为Windows经常进入使用getmessage/peekmessage读取消息并直接处理而不是发布消息的模式状态。

    很多信息 与通知类似,但必须始终传递给defwindowproc,因为它们“秘密”用于实现窗口管理器。(wm激活和朋友)。

    大多数消息都可以在对话过程中通过返回false(或true)来处理,有些结果有意义的消息需要使用setdlgresult,其他消息则自动处理(wm_ctlcolor*)作为对话过程。 知道 dialogproc的非零结果对应于要返回的lresult。

    有些(wm_syscommand)根本不是发送给窗口的真正消息,只是由defwindowproc处理以执行窗口管理器类型的操作(平铺桌面等)。

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


    具体解决 WM_SET/GETFONT 问题, WM_SETFONT 定义的消息不由defwindowproc处理,因此不由不显式支持它的窗口类处理。控件(编辑、静态等)和对话框支持 WMWSET字体 WM_GETFONT . 要在应用程序注册类中支持它,需要提供实际的自定义windowproc并在其中处理消息。