CStatic子类控件无法接收输入消息

时间:2015-10-25 01:28:13

标签: c++ mfc subclass window-messages

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

以下是我的Dialog的样子:

enter image description here

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

我已经做过:

  • 更改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);
}

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

1 个答案:

答案 0 :(得分:2)

您无法处理WM_MOUSEWHEEL中的CStatic,因为它无法通过设计获得焦点。

来自MSDN:

  

鼠标时,WM_MOUSEWHEEL消息被发送到焦点窗口   轮子旋转

通过查看您的屏幕截图,我建议改为继承CListBox