Polymorphismus und ViewWechsel (SplitterWnd)



  • Ja, hab da ein Problem. Ist ein bisschen Komplizierter, als ich dachte,
    und deshalb post ich es mal hier...

    Ich habe einen TreeView, und einen CFormView im Fenster.
    Ich wechsel immer wieder zwischen verschiedenen CFormView hin und her.
    Jedes mal muss ich allerdings die CFormView mit Datenfüllen, dazu hab ich
    in den Klassen von CFormView funktionen, allerdings, unterschiedliche, und
    so nützt es mir nix wenn ich darauf zugreifen will, weil ich ja immer ein CFormView
    objekt zurück bekomme...

    Code für View Wechsel:

    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= 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;
    //  row = 0;
    //  col = 1;
        // 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;
    }
    

    Also wie gesagt, ich muss auf die Abgeleitete Klasse direkt zugreifen, weil
    sie noch extra Funktionen hat...

    Klasse A von FormView
    Klasse B von FormView
    haben jeweils aber noch neue Funktionen die FormView nicht hat,
    wie greif ich darauf dann zu ?

    Devil

    [ Dieser Beitrag wurde am 15.02.2003 um 12:54 Uhr von devil81 editiert. ]



  • Hi,
    schau doch mal bei CodeGuru,die haben jede Menge zu dem Thema.
    Ich glaube es gibt auch noch die Möglichkeit die View mit SetWindowLong zu wechseln indem man die ID der View (GWL_ID) mit der,der neuen View tauscht.
    Dann könntest du ganz normal ein Objekt deiner spezialisierten View erstellen und dann tauschen.Hab das irgendwann mal gelesen aber nie probiert 🙄 .

    MfG Spacelord 🙂



  • Das Vertauschen ist nicht mein Problem...

    Devil



  • Klar!



  • Hi!
    Also direkten Zugriff auf die Klasse (eigentlich View) bekommst du mit GetPane.

    mfg mike 😃



  • Da Du den Zeiger auf die Klasse besitzt, kannst Du Dir direkt per STATIC_DOWNCAST den Zeiger in die gewünschte Klasse konvertieren. Anschließend stehen Dir alle speziellen Methoden der Klasse zur Verfügung.

    -----------------------------------------------------------------
    Intelligenz unterscheidet den Menschen vom Tier (und vom Zombie).


Anmelden zum Antworten