Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CStatic子类控件无法接收输入消息_C++_Mfc_Subclass_Window Messages - Fatal编程技术网

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

C++ CStatic子类控件无法接收输入消息,c++,mfc,subclass,window-messages,C++,Mfc,Subclass,Window Messages,我使用的是基于MFC对话框的应用程序,有一个子类CStatic控件。我希望在我的子类控件中接收WM_MOUSEWHEEL和其他消息,但不知何故,这些消息从未到达 下面是我的对话框的外观: 我只是在做一些非常简单的绘图,希望能够通过滚动上下移动我的列表 我已经: 更改选项卡顺序以确保首先关注子类CStatic控件 重写OnChittest以始终关注子类CStatic 在侧面添加了一个滚动条 为WM_鼠标滚轮、WM_LBUTTONDOWN、WM_KEYDOWN和WM_VSCROLL编写消息处理程

我使用的是基于MFC对话框的应用程序,有一个子类
CStatic
控件。我希望在我的子类控件中接收WM_MOUSEWHEEL和其他消息,但不知何故,这些消息从未到达

下面是我的对话框的外观:

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

我已经:

  • 更改选项卡顺序以确保首先关注子类CStatic控件
  • 重写OnChittest以始终关注子类CStatic
  • 在侧面添加了一个滚动条
  • 为WM_鼠标滚轮、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);
}

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

您无法在
CStatic
中处理
WM\u鼠标滚轮
,因为它无法通过设计获得焦点

来自MSDN:

鼠标移动时,WM_MOUSEWHEEL消息将发送到焦点窗口 车轮转动


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

为什么选择CButton?默认情况下,我会使用CWnd。是的,只要看他的屏幕截图,我就认为他需要
CListBox
派生类。不幸的是,事情并没有那么简单:首先,我相信并且几乎100%肯定,使用
CListBox
可以轻松解决他的任务。MSH_MOUSEWHEEL的问题在于,它最初的设计就像是针对旧版OSs的一种变通/破解解决方案。所以我不建议依赖这些东西。我实际上指的是博客中的第二点,你从中省略了:“当鼠标滚轮旋转时发送到焦点窗口。函数将消息传播到窗口的父窗口。”Andrew已经给了你一个很好的答案,但是我想问一下,为什么不使用列表框来派生呢?它们可以大量定制,包括图标和文本。