Почему дочернее окно может не получать события мыши?

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

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


person Ivan Krechetov    schedule 18.03.2009    source источник
comment
Может ли родительский контроль забирать все сообщения Windows для этого региона?   -  person RobS    schedule 18.03.2009
comment
Нет. В список поступают события мыши. Проблема с классом полосы прокрутки. Смотрите мой ответ ниже.   -  person Ivan Krechetov    schedule 18.03.2009


Ответы (2)


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

person jdigital    schedule 18.03.2009

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

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

Переход на:

class CScrollBase : public ATL::CWindowImpl<CScrollBase>

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

person Ivan Krechetov    schedule 18.03.2009