2010-04-02 5 views
2

왼쪽 및 오른쪽에 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 및 CPaneContainerImpl :: WTL에서 창이 파생 :

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

당신은 CContainedWindow와 함께 ALT_MSG_MAP()을 사용할 수 있습니다 - 당신은 당신이 CContainedWindow 생성자에 전달 ATL_MSG_MAP()에 대한 메시지 맵 ID를 지정합니다.

CContainedWindowT에 대한 ATL 설명서에 예제가 있습니다.