1

我正在使用基于 MFC 对话框的应用程序并有一个子类CStatic控件。我想在我的子类控件中接收 WM_MOUSEWHEEL 和其他消息,但不知何故这些消息永远不会到达。

这是我的对话框的样子:

在此处输入图像描述

我只是在做一些非常简单的绘图,并且希望能够通过滚动来上下移动我的列表。

我已经做了:

  • 更改 Tab-Order 以确保首先关注子类 CStatic 控件
  • 重写 OnNcHitTest 以始终​​关注子类 CStatic
  • 在侧面添加了滚动条
  • 为 WM_MOUSEWHEEL、WM_LBUTTONDOWN、WM_KEYDOWN 和 WM_VSCROLL 编写消息处理程序
  • 试图捕捉消息PreTranslateMessage

可悲的是,当我在对话框内滚动/按下一个键或用我的鼠标点击时,什么都没有被调用。消息只是没有到达。

这是我的鼠标滚轮处理程序,例如:

class CFolderView : public CStatic
{
   ...
   afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
   DECLARE_MESSAGE_MAP()
   ...
}

BEGIN_MESSAGE_MAP(CFolderView, CStatic)
    ON_WM_MOUSEWHEEL()
    ON_WM_KEYDOWN()
    ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()

BOOL CFolderView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
    MessageBox("Mouse Wheel moved!", "Debug", MB_OK);

    return CStatic::OnMouseWheel(nFlags, zDelta, pt);
}

我不明白为什么没有输入消息被发送到我的子类控件。是否有一些开关可以为子类控件启用输入?

4

1 回答 1

2

您无法处理WM_MOUSEWHEELCStatic因为它无法通过设计获得焦点。

来自 MSDN:

WM_MOUSEWHEEL 消息在鼠标滚轮旋转时发送到焦点窗口

通过查看您的屏幕截图,我建议CListBox改为子类化。

于 2015-10-25T08:03:50.033 回答