2009-03-18 14 views
1

私はリストとカスタムスクロールバーを持つパネルであるカスタム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ハンドラを追加すると、それが呼び出されます。

何が問題なのですか?

+0

親コントロールがその領域のすべてのウィンドウメッセージをスワールすることはできますか? – RobS

+0

いいえリストはマウスイベントを受け取ります。スクロールバークラスが問題でした。下の私の答えを見てください。 –

答えて

1

見つけました。問題は、スクロールバーのクラス宣言にあった:に変更

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

class CScrollBase : public ATL::CWindowImpl<CScrollBase> 

は、パネル上のスクロールバーの仕事になります。

2

Windowsメッセージングの問題を診断するには、Spy ++またはWinspectorを使用して、Windowsメッセージングについてのアンダーザカバーを得ることができます。

関連する問題