1

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

4

2 回答 2

3

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

  1. 将您的测试更改为 if(uMsg == WM_MOUSEWHEEL )。
  2. 检查您的窗口或其中一个孩子是否有焦点。
  3. 如果这与您之前的 wtl-child-window-event-handling问题有关,我将我的答案编辑为不转发 WM_MOUSEWHEEL
于 2010-04-26T06:02:48.217 回答
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)
   { ... }
};
于 2010-04-24T14:32:45.423 回答