SplitterWindow & CTreeView/CFormView , verschiedene Dialoge



  • Hi, also habs schon versucht im Topic zu beschreiben.

    Situation: Ich habe ein TreeView und ein FormView.
    Je nachdem was in dem TreeView ausgewählt wurde, muss allerdings
    ein anderer Dialog geladen werden ...

    Nur wie bekomme ich das bei CFormView hin ?

    Devil



  • Für jedes Dialogtemplate ein CFormView machen und dann -> siehe switching Views bzw. multiple views for one document



  • hm, is auch ne Möglichkeit.
    Ich schaus mir mal an 🙂



  • Ok, das hat mir erst mal weiter geholfen.
    Allerdings funzt es nicht beim Splitter.

    //  CView* pOldActiveView = GetActiveView();    // save old view
        CView* pNewActiveView = (CView*)GetDlgItem(nForm);  // get new view
    
        if (pNewActiveView == NULL)
        {
            switch(nForm) // these IDs are the dialog IDs of the view but can use anything
            {
               case IDD_CLASSBUILDER_FORM:
                    pNewActiveView = (CView*)new CClassBuilderView;
                    break;
    
               case IDD_FUNKTIONEN:
                    pNewActiveView = (CView*)new DFunktion;
                    break;
    
               case IDD_VAR:
                    pNewActiveView = (CView*)new DVar;
            }
    
        CFrameWnd* pMainWnd = (CFrameWnd*)AfxGetMainWnd();
        CView* pOldActiveView = pMainWnd->GetActiveView();
    
        // If we're already displaying this kind of view, no need to go further.
        //if (pOldActiveView->IsKindOf(pNewActiveView->GetRuntimeClass()))
        //else
    
        CSplitterWnd* pSplitter = (CSplitterWnd *)pOldActiveView->GetParent();
        int row= 0, col=1;
        ASSERT(pSplitter->IsChildPane(pOldActiveView, row, col));
        CRect viewrect;
        pOldActiveView->GetWindowRect(&viewrect);
    
        // set flag so that document will not be deleted when view is destroyed
    //  m_bAutoDelete = FALSE;    
        // Delete existing view 
        pOldActiveView->DestroyWindow();
        // set flag back to default 
    //  m_bAutoDelete = TRUE;
    
        // Create new view                      
        CCreateContext context;
        context.m_pNewViewClass = pNewActiveView->GetRuntimeClass();
        context.m_pCurrentDoc = pOldActiveView->GetDocument();
        context.m_pNewDocTemplate = NULL;
        context.m_pLastView = NULL;
        context.m_pCurrentFrame = NULL;
        if (pSplitter->CreateView(row, col, pNewActiveView->GetRuntimeClass(), viewrect.Size(), &context))//hier kommt der fehler
        {
        // Set active 
        CView* pNewView = (CView *)pSplitter->GetPane(row, col);
        pSplitter->GetParentFrame()->SetActiveView(pNewView);
    
        pSplitter->RecalcLayout(); 
        pNewView->SendMessage(WM_PAINT);
        }
        }
    

    Devil

    [ Dieser Beitrag wurde am 29.01.2003 um 21:28 Uhr von devil81 editiert. ]

    [ Dieser Beitrag wurde am 29.01.2003 um 21:31 Uhr von devil81 editiert. ]



  • Hallo,
    schau mal bei Codeguru, da gibts ne fertige Klasse, die genau das kann



  • OK, fehler gefunden, in der Doc funktioniert es und nicht in der CMainFrame...

    Code:

    BOOL CClassBuilderDoc::SwitchToView(CRuntimeClass *pNewViewClass)
    {
    
        CFrameWnd* pMainWnd = (CFrameWnd*)AfxGetMainWnd();
        CView* pOldActiveView = pMainWnd->GetActiveView();
    
        // If we're already displaying this kind of view, no need to go further.
        if (pOldActiveView->IsKindOf(pNewViewClass))
            return TRUE;
    
        CSplitterWnd* pSplitter = (CSplitterWnd *)pOldActiveView->GetParent();
        pOldActiveView = (CView*)pSplitter->GetPane(0,1);//damit er nicht den Falschen View Löscht
        int row, col;
        ASSERT(pSplitter->IsChildPane(pOldActiveView, row, col));
        CRect viewrect;
        pOldActiveView->GetWindowRect(&viewrect);
    
        // set flag so that document will not be deleted when view is destroyed
        m_bAutoDelete = FALSE;    
        // Delete existing view 
        pOldActiveView->DestroyWindow();
        // set flag back to default 
        m_bAutoDelete = TRUE;
    
        // Create new view                      
        CCreateContext context;
        context.m_pNewViewClass = pNewViewClass;
        context.m_pCurrentDoc = this;
        context.m_pNewDocTemplate = NULL;
        context.m_pLastView = NULL;
        context.m_pCurrentFrame = NULL;
        if (!pSplitter->CreateView(row, col, pNewViewClass, viewrect.Size(), &context))
            return FALSE;
    
        // Set active 
        CView* pNewView = (CView *)pSplitter->GetPane(row, col);
        pSplitter->GetParentFrame()->SetActiveView(pNewView);
    
        pSplitter->RecalcLayout(); 
        pNewView->SendMessage(WM_PAINT); 
        return TRUE;
    }
    

    Devil

    [ Dieser Beitrag wurde am 30.01.2003 um 11:57 Uhr von devil81 editiert. ]



  • Also ich ahbe diese unktion mal in meine Documenten Klasse kopiert. Wo soll ich die nu Aufriúfen, bzw Wie? Und vor allem ist dann der Aufruf richtig?
    SwitchToView(RUNTIME_CLASS(CKlasse));


Anmelden zum Antworten