2009-03-18 7 views
1

Ich habe ein benutzerdefiniertes WTL-Steuerelement, das ein Panel mit einer Liste und einer benutzerdefinierten Bildlaufleiste ist.Warum erhält ein untergeordnetes Fenster möglicherweise keine Mausereignisse?

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() 

Die Bildlaufleiste wird von der Platte in OnCreate() erstellt:

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

Das Bar scrollen funktioniert in vielen anderen Dialogfenstern in Ordnung. In diesem Panel-Steuerelement wird jedoch die Bildlaufleiste angezeigt, aber es werden überhaupt keine Mausereignisse empfangen. Wenn ich den Handler WM_MOUSEMOVE zum Panel hinzufüge, wird er aufgerufen.

Was könnte das Problem sein?

+0

Könnte das Elternsteuerelement alle Windows-Nachrichten für diese Region verschlingen? – RobS

+0

Nein. Die Liste empfängt die Mausereignisse. Die Rollbalken-Klasse war das Problem. Siehe meine Antwort unten. –

Antwort

1

Es gefunden. Das Problem war in der Bildlaufleiste Klassendeklaration:

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

Wechsel zu:

class CScrollBase : public ATL::CWindowImpl<CScrollBase> 

macht die Bildlaufleiste Arbeit auf dem Panel.

2

Eine gute Möglichkeit, Probleme mit Windows-Messaging zu diagnostizieren, ist die Verwendung von Spy ++ oder Winspector, mit denen Sie die Windows-Messaging-Funktionen unter die Decke bringen können.

Verwandte Themen