OnMouseWheel 未在对话框中调用

问题描述 投票:0回答:2

有一个对话框(

CDialog
)。

所有鼠标事件都会触发其相应的处理程序,即:

  • 鼠标左键按下事件触发
    OnLButtonDown
    处理程序
  • 鼠标右键按下事件触发
    OnRButtonDown
    处理程序
  • 鼠标左键向上事件触发
    OnLButtonUp
    处理程序
  • 鼠标右键向上事件触发
    OnRButtonUp
    处理程序
  • 鼠标移动事件触发
    OnMouseMove
    处理程序

除鼠标滚轮事件外的所有事件,由于某种原因不会触发

OnMouseWheel
处理程序。

祸??? (如“What On Earth”,这是表达我目前对 MFC 的想法的温和方式)。

相反,我需要在

PreTranslateMessage
处理程序中处理这些事件。

当然,我可以使用它作为解决方案,但出于编码原因,我非常愿意以与处理所有其他鼠标事件相同的方式处理它们。

知道这里可能出现什么问题吗?

我找到的大多数答案都建议将

ON_WM_MOUSEHWHEEL
添加到消息映射中,但我当然已经这样做了(就像我对所有其他鼠标事件所做的那样)。

我发现一个答案建议将

WS_TABSTOP
添加到对话框样式。不可能看出其中的逻辑意义,但无论如何尝试了(没有任何成功,正如预期的那样)。

谢谢你。

我的代码:

头文件:

class CInputDlg : public CDialog
{
public:
    CInputDlg(CWnd* pParent = NULL);
    virtual ~CInputDlg();

DECLARE_MESSAGE_MAP();

protected:
    afx_msg void OnLButtonDown(UINT flags,CPoint point);
    afx_msg void OnMouseWheel(UINT flags,short delta,CPoint point);
};

源文件:

BEGIN_MESSAGE_MAP(CInputDlg,CDialog)
    ON_WM_LBUTTONDOWN()
    ON_WM_MOUSEHWHEEL()
END_MESSAGE_MAP()

CInputDlg::CInputDlg(CWnd* pParent):CDialog(IDD_DIALOG,pParent)
{
}

CInputDlg::~CInputDlg()
{
}

void CInputDlg::OnLButtonDown(UINT flags,CPoint point)
{
    // This function is reached when I click the mouse-left-button
}

void CInputDlg::OnMouseWheel(UINT flags,short delta,CPoint point)
{
    // This function is not reached when I roll the mouse-wheel
}

资源文件:

IDD_DIALOG DIALOGEX 0, 0, 400, 200
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_MAXIMIZEBOX |
WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
EXSTYLE WS_EX_APPWINDOW
BEGIN
END
winapi mfc
2个回答
0
投票

这应该有效:

对话框消息图:

...
BEGIN_MESSAGE_MAP(CMFCApplicationDlg, CDialog)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_WM_MOUSEWHEEL()   // <<< added this
END_MESSAGE_MAP()
...

实施:

BOOL CMFCApplicationDlg::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
  // This feature requires Windows Vista or greater.
  // The symbol _WIN32_WINNT must be >= 0x0600.

  TRACE("Mouse wheel message: (%d, %d), d = %d\n", pt.x, pt.y, zDelta);
  return CDialog::OnMouseWheel(nFlags, zDelta, pt);
}

对话框类定义:

class CMFCApplicationDlg : public CDialog
{
  ...
  afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);  // added this
};

这是从新创建的基于对话框的 MFC 应用程序中提取的。我刚刚添加了上面提到的行。


0
投票

有2个宏:

ON_WM_MOUSEHWHEEL() -> BOOL OnMouseWheel() 和

ON_WM_MOUSEWHEEL() -> void OnMouseHWheel()。

您需要使用ON_WM_MOUSEWHEEL()。

© www.soinside.com 2019 - 2024. All rights reserved.