CStatic 子类化控件无法接收输入消息
CStatic subclassed Control fails to receive input messages
我正在使用基于 MFC 对话框的应用程序,并且有一个子类 CStatic
控件。我想在我的子类控件中接收 WM_MOUSEWHEEL 和其他消息,但不知何故这些消息永远不会到达。
这是我的对话框的样子:
我只是在做一些非常简单的绘图,希望能够通过滚动来上下移动我的列表。
我已经做了:
- 更改 Tab 键顺序以确保首先关注子类化的 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);
}
我不明白为什么没有输入消息发送到我的子类控件。是否有一些开关可以为子类控件启用输入?
您无法在 CStatic
中处理 WM_MOUSEWHEEL
,因为它无法通过设计获得焦点。
来自 MSDN:
The WM_MOUSEWHEEL message is sent to the focus window when the mouse
wheel is rotated
通过查看您的屏幕截图,我建议改为子类化 CListBox
。
我正在使用基于 MFC 对话框的应用程序,并且有一个子类 CStatic
控件。我想在我的子类控件中接收 WM_MOUSEWHEEL 和其他消息,但不知何故这些消息永远不会到达。
这是我的对话框的样子:
我只是在做一些非常简单的绘图,希望能够通过滚动来上下移动我的列表。
我已经做了:
- 更改 Tab 键顺序以确保首先关注子类化的 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);
}
我不明白为什么没有输入消息发送到我的子类控件。是否有一些开关可以为子类控件启用输入?
您无法在 CStatic
中处理 WM_MOUSEWHEEL
,因为它无法通过设计获得焦点。
来自 MSDN:
The WM_MOUSEWHEEL message is sent to the focus window when the mouse wheel is rotated
通过查看您的屏幕截图,我建议改为子类化 CListBox
。