【问题标题】:Why a child window may not receive mouse events?为什么子窗口可能收不到鼠标事件?
【发布时间】:2010-10-14 02:06:58
【问题描述】:

我有一个自定义 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 处理程序添加到面板,它会被调用。

可能是什么问题?

【问题讨论】:

  • 父控件是否会吞噬该区域的所有 Windows 消息?
  • 没有。该列表确实接收到鼠标事件。滚动条类是问题所在。请参阅下面的答案。

标签: c++ windows winapi wtl


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    改为:

    class CScrollBase : public ATL::CWindowImpl<CScrollBase>
    

    使滚动条在面板上起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多