【问题标题】:Handling wm_mousewheel message in WTL在 WTL 中处理 wm_mousewheel 消息
【发布时间】:2010-04-24 13:28:41
【问题描述】:

我正在尝试为我的应用程序处理 wm_mousewheel。

代码:

BEGIN_MSG_MAP(DxWindow)     
  MESSAGE_HANDLER(WM_MOUSEWHEEL, KeyHandler)
END_MSG_MAP()
.
.
.

LRESULT DxWindow::KeyHandler( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled )
 {
     if(uMsg==wm_mousewheel)
     {
       //Perform task.
     }
     return 0;
 }

但是这段代码不起作用。KeyHandler 没有收到 wm_mousewheel 消息。 我正在 vista 上测试这个应用程序。 如果我的方法错误,如何正确处理 wm_mousewheel? vista 是否对处理 wm_mousewheel 消息失败负责?

【问题讨论】:

    标签: c++ mousewheel wtl


    【解决方案1】:

    来自doc: WM_MOUSEWHEEL 消息在鼠标滚轮旋转时发送到焦点窗口。 DefWindowProc 函数将消息传播到窗口的父级。消息不应进行内部转发,因为 DefWindowProc 会将消息沿父链向上传播,直到找到处理它的窗口。

    1. 将您的测试更改为 if(uMsg == WM_MOUSEWHEEL)。
    2. 检查您的窗口或其中一个子窗口是否有焦点。
    3. 如果这与您之前的@​​987654322@ 问题有关,我将answer 编辑为不转发WM_MOUSEWHEEL

    【讨论】:

      【解决方案2】:

      首先,您不必在消息处理程序中检查 uMsg,因为在这种情况下,每个消息处理程序都绑定到一个具体消息。

      其次,这些 atl 宏通常意味着在地图末尾写上类似 CHAIN_MSG_MAP(CMyBaseClass) 的内容。

      无论如何,您在这里发布的内容看起来还不错,除了这部分:

      if(uMsg==wm_mousewheel)
      {
        //Perform task.
      }
      

      尝试擦除它,向处理程序添加断点并进行调试。您也可以尝试添加另一个中性消息处理程序(例如WM_CLICK)并跟踪它的行为。

      这是来自 MSDN 的示例,您发布的代码块实际上遵循它。

      class CMyWindow : ...
      {
      public:
         ...
      
         BEGIN_MSG_MAP(CMyWindow)
            MESSAGE_HANDLER(WM_PAINT, OnPaint)
            MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
            CHAIN_MSG_MAP(CMyBaseWindow)
         END_MSG_MAP()
      
         LRESULT OnPaint(UINT uMsg, WPARAM wParam, 
                         LPARAM lParam, BOOL& bHandled)
         { ... }
      
         LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, 
                            LPARAM lParam, BOOL& bHandled)
         { ... }
      };
      

      【讨论】:

        猜你喜欢
        • 2010-12-14
        • 1970-01-01
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        • 2011-07-06
        • 1970-01-01
        • 2011-12-04
        • 1970-01-01
        相关资源
        最近更新 更多