为什么一个子窗口可能不会收到鼠标事件?

我有一个自定义的WTL控件,它是一个带有列表和自定义滚动条的面板。

class Panel : public ATL::CWindowImpl<Panel>, public WTL::CDoubleBufferImpl<Panel> { public: DECLARE_WND_CLASS("Panel") BEGIN_MSG_MAP_EX(Panel) MSG_WM_CREATE(OnCreate) MSG_WM_DESTROY(OnDestroy) MSG_WM_SIZE(OnSize) CHAIN_MSG_MAP(CDoubleBufferImpl<Panel>) REFLECT_NOTIFICATIONS() END_MSG_MAP() 

滚动条由OnCreate()中的面板创build:

 m_scrollBar.Create(m_hWnd, WTL::CRect(...)); 

该滚动条在许多其他对话窗口中工作正常。 但是,在该面板控件内部会出现滚动条,但根本没有收到鼠标事件。 如果我添加WM_MOUSEMOVE处理程序到面板,它确实被调用。

可能是什么问题呢?

诊断Windows消息传递问题的一个好方法是使用Spy ++或Winspector ,它们使您可以在Windows消息传递中获得隐藏的外观。

找到了。 问题出在滚动条的类声明中:

 class CScrollBase : public ATL::CWindowImpl<CScrollBase, WTL::CStatic> 

更改为:

 class CScrollBase : public ATL::CWindowImpl<CScrollBase> 

使滚动条在面板上工作。