我正在尝试为我的应用程序处理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消息失败负责?
答案 0 :(得分:2)
来自doc: 旋转鼠标滚轮时,WM_MOUSEWHEEL消息将发送到焦点窗口。 DefWindowProc函数将消息传播到窗口的父级。消息应该没有内部转发,因为DefWindowProc将它传播到父链,直到它找到一个处理它的窗口。
答案 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)
{ ... }
};