我有一个自定义的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>
使滚动条在面板上工作。