2010-11-07 2 views
3

Je travaille avec MFC MDI. J'ai besoin de créer des vues comme suit. Mon ChildWnd est divisé en 2 parties. Ils sont LeftView qui est un CView et RightView qui est un CScrollView. Le LeftView est divisé en 2 parties, le TreeView et le FormView. Comment puis je faire ça?Créer plusieurs vues dans un CChildFrame en utilisant CSplitterWnd

_________________________________ 
|   |     | 
|   |     | 
|CTreeView |     | 
|   |     | 
|   |     | 
|   |  CScrollView | 
|___________|     | 
|   |     | 
|   |     | 
|CFormView |     | 
|   |     | 
|   |     | 
---------------------------------- 

Répondre

2

J'ai finalement résolu ce problème. J'ai écrit la solution pour tous ceux qui ont un problème similaire.

  1. Dans la classe CChildFrame, déclarez CSplitterWnd m_SplitterWnd;

  2. Dans CChildFrame :: OnCreateClient mis le code suivant:

    if(!m_SplitterWnd.CreateStatic(this, 1, 2)) 
    { 
        TRACE("Failed to create splitter window"); 
        return FALSE; 
    } 
    pContext->m_pNewViewClass = RUNTIME_CLASS(CLeftView); 
    m_SplitterWnd.CreateView(0, 0, pContext->m_pNewViewClass, CSize(0, 0), pContext); 
    m_pLeftView=(CLeftView*)m_SplitterWnd.GetPane(0,0); 
    CCreateContext context; 
    context.m_pNewViewClass = pContext->m_pNewViewClass; //save original 
    
    pContext->m_pNewViewClass = RUNTIME_CLASS(CRightView); 
    m_SplitterWnd.CreateView(0, 1, pContext->m_pNewViewClass, CSize(0, 0), pContext); 
    pContext->m_pNewViewClass = context.m_pNewViewClass; //return to original 
    m_pRightView=(CRightView*)m_SplitterWnd.GetPane(0,1); 
    
    int nWidth=rc.Width(); 
    m_SplitterWnd.SetColumnInfo(0, nWidth*0.25, 50); 
    m_SplitterWnd.SetColumnInfo(1, nWidth*0.75, 50); 
    

    CLeftView est une classe dérivée MFC CView.

  3. Dans CLeftView, déclarez une variable membre CSplitterWnd m_SplitterWnd;

  4. Dans CLeftView :: OnCreate, ajoutez le code suivant:

    CCreateContext *pContext = (CCreateContext*) lpCreateStruct->lpCreateParams; 
    
    if(!m_SplitterWnd.CreateStatic(this, 2, 1, WS_CHILD | WS_VISIBLE, AFX_IDW_PANE_FIRST+8)) 
    { 
        TRACE("Failed to create splitter window"); 
        return FALSE; 
    } 
    pContext->m_pNewViewClass = RUNTIME_CLASS(CPhongView); 
    m_SplitterWnd.CreateView(0, 0, pContext->m_pNewViewClass, CSize(0, 0), pContext); 
    m_pPhongView=(CPhongView*)m_SplitterWnd.GetPane(0, 0); 
    CCreateContext context; 
    context.m_pNewViewClass = pContext->m_pNewViewClass; //save original 
    
    pContext->m_pNewViewClass = RUNTIME_CLASS(CPhongInfo); 
    m_SplitterWnd.CreateView(1, 0, pContext->m_pNewViewClass, CSize(0, 0), pContext); 
    pContext->m_pNewViewClass = context.m_pNewViewClass; //return to original 
    m_pPhongInfo=(CPhongInfo*)m_SplitterWnd.GetPane(1, 0); 
    

    CPhongInfo est une classe dérivée de CFormView, CPhong View est une classe CTreeView.

  5. Dans CLeftView :: OnSize, mettre le code suivant

    m_SplitterWnd.MoveWindow(0, 0, cx, cy); 
    int nRow2 = 227; 
    int nRow1 = cy - 227; 
    m_SplitterWnd.SetRowInfo(0, nRow1, 0); 
    m_SplitterWnd.SetRowInfo(1, nRow2, 0); 
    m_SplitterWnd.RecalcLayout(); 
    
+0

Ce serait une bonne réponse si vous souhaitez ranger vos étiquettes de code. –

+0

Vous lancez un CREATESTRUCT sur un CCreateContext. Ce n'est pas une distribution valide. Ce n'est que par pure chance que le CREATESTRUCT a commencé avec des zéros. – Charles

Questions connexes