Почему дочернее окно может не получать события мыши? - PullRequest
1 голос
/ 18 марта 2009

У меня есть пользовательский элемент управления 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 на панель, он будет вызван.

В чем может быть проблема?

Ответы [ 2 ]

2 голосов
/ 18 марта 2009

Хороший способ диагностировать проблемы с обменом сообщениями Windows - это использовать Spy ++ или Winspector , которые позволяют вам взглянуть на сообщения Windows в секрете.

1 голос
/ 18 марта 2009

Нашел это. Проблема была в объявлении класса полосы прокрутки:

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

Изменение на:

class CScrollBase : public ATL::CWindowImpl<CScrollBase>

заставляет полосу прокрутки работать на панели.

...