2010-04-24 24 views
1

我正在尝试为我的应用程序处理wm_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; 
} 

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

回答

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) 
    { ... } 
}; 
2

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

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