首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对话框中未调用OnMouseWheel

对话框中未调用OnMouseWheel
EN

Stack Overflow用户
提问于 2017-05-23 10:01:04
回答 1查看 1.4K关注 0票数 0

在有对话框(CDialog)中。

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

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

除了鼠标轮事件之外,由于某些原因不会触发OnMouseWheel处理程序。

不幸?(在“地球上的什么”中,这是目前表达我对MFC的想法的一种温和方式)。

相反,我需要在PreTranslateMessage处理程序中处理这些事件。

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

知道这里有什么问题吗?

我发现的大多数答案都建议将ON_WM_MOUSEHWHEEL添加到消息映射中,但我当然已经在这样做了(就像对所有其他鼠标事件一样)。

我找到了一个建议将WS_TABSTOP添加到对话框样式的答案。不可能看到逻辑的意义,但无论如何尝试(没有任何成功,如预期)。

谢谢。

我的代码:

头文件:

代码语言:javascript
复制
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);
};

源文件:

代码语言:javascript
复制
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
}

资源文件:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2017-05-23 10:30:30

这应该是可行的:

对话框消息映射:

代码语言:javascript
复制
...
BEGIN_MESSAGE_MAP(CMFCApplicationDlg, CDialog)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_WM_MOUSEWHEEL()   // <<< added this
END_MESSAGE_MAP()
...

执行情况:

代码语言:javascript
复制
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);
}

对话框类定义:

代码语言:javascript
复制
class CMFCApplicationDlg : public CDialog
{
  ...
  afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);  // added this
};

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44131641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档