2010-04-02 108 views
2

我正在開發窗口應用程序,因爲我在左側和右側有兩個子窗口。 我想分別處理兩個窗口的輸入事件。 如何實現它?WTL子窗口事件處理

我的代碼:

class EditorWindow : public DxWindow 
{ 
public: 
    CSplitterWindow m_vSplit; 
    CPaneContainer m_lPane; 
    CPaneContainer m_rPane; 
    PropertyDialog m_propertyWnd; 
    DECLARE_WND_CLASS(_T("Specific_Class_Name")) 

    BEGIN_MSG_MAP(EditorWindow) 
     MESSAGE_HANDLER(WM_CREATE, OnCreate) 
     MESSAGE_HANDLER(WM_DESTROY, OnDestroy) 
     MESSAGE_HANDLER(WM_LBUTTONDOWN, KeyHandler) 
     MESSAGE_HANDLER(WM_KEYUP, KeyHandler) 
     MESSAGE_HANDLER(WM_LBUTTONDOWN, KeyHandler) 
    END_MSG_MAP() 

    LRESULT OnCreate(UINT, WPARAM, LPARAM, BOOL&) 
    { 
     CRect rcVert; 
     GetClientRect(&rcVert);  
     m_vSplit.Create(m_hWnd, rcVert, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN); 
     m_vSplit.SetSplitterPos(rcVert.Width()/1.4f); // from left 
     m_lPane.Create(m_vSplit.m_hWnd);   
     m_vSplit.SetSplitterPane(0, m_lPane); 
     //m_lPane.SetTitle(L"Left Pane"); 

     m_rPane.Create(m_vSplit.m_hWnd);  
     m_vSplit.SetSplitterPane(1, m_rPane);  
     m_rPane.SetTitle(L"Properties"); 
     m_propertyWnd.Create(m_rPane.m_hWnd); 
     //m_vSplit.SetSplitterPane(SPLIT_PANE_LEFT, md.m_hWnd); 

     return 0; 
    } 
    LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) 
    { 
     PostQuitMessage(0); 
     bHandled = FALSE; 
     return 0; 
    } 
    LRESULT KeyHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) 
    { 
     return 0; 
    } 

}; 

回答

5

WTL :: CSplitterWindow和WTL :: CPaneContainer不會將WM_KEYxxx和WM_MOUSExxx消息轉發給它們的父代。

派生從WTL :: CSplitterWindowImpl您EditorWindow和WTL :: CPaneContainerImpl您窗格比如:

class CMyPaneContainer : public CPaneContainerImpl<CMyPaneContainer> 
{ 
public: 
    DECLARE_WND_CLASS_EX(_T("MyPaneContainer"), 0, -1) 
    BEGIN_MSG_MAP(CMyPaneContainer) 
     MESSAGE_RANGE_HANDLER(WM_KEYFIRST, WM_KEYLAST, OnForward) 
     MESSAGE_RANGE_HANDLER(WM_MOUSEFIRST, WM_MOUSELAST, OnForward) 
     CHAIN_MSG_MAP(CPaneContainerImpl<CMyPaneContainer>) 
    END_MSG_MAP() 

    LRESULT OnForward(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 
    { 
     if (uMsg == WM_MOUSEWHEEL) 
      return bHandled = FALSE; // Don't forward WM_MOUSEWHEEL 
     return GetParent().SendMessage(uMsg, wParam, lParam); 
    } 
}; 


class EditorWindow : public CSplitterWindowImpl<EditorWindow, true, CWindow/*DxWindow*/> 
{ 
    typedef CSplitterWindowImpl<EditorWindow, true, CWindow/*DxWindow*/> baseClass; 
public: 
    CMyPaneContainer m_lPane; 
    CMyPaneContainer m_rPane; 
    //PropertyDialog m_propertyWnd; 
    DECLARE_WND_CLASS(_T("Specific_Class_Name")) 

    BEGIN_MSG_MAP(EditorWindow) 
     MESSAGE_HANDLER(WM_CREATE, OnCreate) 
     MESSAGE_HANDLER(WM_LBUTTONDOWN, KeyHandler) 
     MESSAGE_HANDLER(WM_KEYUP, KeyHandler) 
     CHAIN_MSG_MAP(baseClass) 
    END_MSG_MAP() 

    LRESULT OnCreate(UINT, WPARAM, LPARAM, BOOL&) 
    { 
     m_lPane.Create(m_hWnd);   
     m_lPane.SetTitle(L"Left Pane"); 

     m_rPane.Create(m_hWnd);  
     m_rPane.SetTitle(L"Properties"); 
     //m_propertyWnd.Create(m_rPane.m_hWnd); 
     SetSplitterPosPct(70); // 70% from left 
     SetSplitterPanes(m_lPane, m_rPane); 

     return 0; 
    } 
3

您可以結合使用ALT_MSG_MAP()CContainedWindow - 您爲ATL_MSG_MAP(),你傳遞給CContainedWindow的構造函數消息映射ID。

對於CContainedWindowT的ATL文檔有一個示例。