1

我有一个自定义 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() 中创建:

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

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

可能是什么问题呢?

4

2 回答 2

2

诊断 Windows 消息传递问题的一个好方法是使用 Spy++ 或Winspector,它们可以让您深入了解 Windows 消息传递。

于 2009-03-18T14:32:03.557 回答
1

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

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

更改为:

class CScrollBase : public ATL::CWindowImpl<CScrollBase>

使滚动条在面板上工作。

于 2009-03-18T14:36:13.657 回答