在WTL中处理wm_mousewheel消息

时间:2010-04-24 13:28:42

标签: c++ mousewheel wtl

我正在尝试为我的应用程序处理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消息失败负责?

2 个答案:

答案 0 :(得分:2)

来自doc: 旋转鼠标滚轮时,WM_MOUSEWHEEL消息将发送到焦点窗口。 DefWindowProc函数将消息传播到窗口的父级。消息应该没有内部转发,因为DefWindowProc将它传播到父链,直到它找到一个处理它的窗口。

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

答案 1 :(得分:0)

首先,您不必以某种方式检查消息处理程序中的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)
   { ... }
};