Warum ein Kind Fenster kann kein Mausereignis empfangen?
Frage
Ich habe eine benutzerdefinierte WTL Steuerung, die ein Panel mit einer Liste und einer benutzerdefinierte Bildlaufleiste.
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 Bildlaufleiste funktioniert in vielen anderen Dialogfenstern in Ordnung. Allerdings steuern innerhalb dieser Platte die Bildlaufleiste angezeigt wird, erhält aber keine Mausereignisse überhaupt. Wenn ich WM_MOUSEMOVE
Handler zum Panel hinzufügen, wird es aufgerufen.
Was könnte das Problem sein?
Lösung 2
es gefunden. Das Problem war in der Bildlaufleiste Klassendeklaration:
class CScrollBase : public ATL::CWindowImpl<CScrollBase, WTL::CStatic>
Der Wechsel zu:
class CScrollBase : public ATL::CWindowImpl<CScrollBase>
macht die Bildlaufleiste Arbeit auf dem Panel.
Andere Tipps
Eine gute Möglichkeit, Probleme mit Windows-Messaging zu diagnostizieren ist Spy ++ zu verwenden oder Winspector die Ihnen erlauben, ein unter-Abdeckungen Blick auf Windows Messaging zu erhalten.