Neuen View aus Menue aufrufen wenn kein View aktiv (MDI)



  • Hallo Leute

    Das thema wurde in einem anderen Posting schon diskutiert
    Jetzt habe ich etwas gefunden wie es funktionieren könnte:

    Gegeben:
    MDI -Projekt
    Dialog Ressource IDD_FORMVIEW , KLasse : CNewFormView
    in C..App Membervariable CMultiDocTemplate * m_pNewFormView

    Eine Document-Klasse erstellen CFormViewDoc

    in C..App.cpp folgende Dateien includieren:

    #include "FormViewDoc.h"
    #include "NewFormView.h"
    

    Button in der Menueleiste IDD_MAINFRAME erstellen zb 'FormView' und
    in C..App eine COMMAND-Fubnktion erstellen.
    Folgender Source in dieser Funktion einfügen:

    POSITION curTemplatePos = GetFirstDocTemplatePosition();
    
    	while(curTemplatePos != NULL)
    	{
    		CDocTemplate* curTemplate =GetNextDocTemplate(curTemplatePos);
    		CString str;
    		curTemplate->GetDocString(str,CDocTemplate::docName);
    
    		if(str == _T("formview"))
    		{
    			curTemplate->OpenDocumentFile(NULL);
    			return;
    		}
    	}
    

    Nun noch in der Funktione InitInstance (nochmals vielen Dank an LowFly)

    m_pDocFormView = new CMultiDocTemplate(IDD_FORMVIEW,
    							RUNTIME_CLASS(CFormViewDoc),
    							RUNTIME_CLASS(CChildFrame),
    							RUNTIME_CLASS(CNewFormView));
    	AddDocTemplate(m_pDocFormView);
    

    So hatte ich mir das gedacht , nur das funktioniert nicht 😡
    Und zwar findet die Funktion GetNextDocTemplate(curTemplatePos) bzw
    GetDocString() nur die Standard-Doc Klasse jedoch nicht meine neue
    CFormViewDoc.

    Villeicht sieht von Euch ja jemand den Fehler ?

    Danke und Gruß
    Linus



  • LOL (ich lach jetzt nicht über dich) hab da grad wieder ein bischen rumgespielt. und die lösung ist so einfach und simpel das man sie leicht übersieht.

    wie estartu schon bemerkt hat kann

    CDocument *pDoc = (CDocument*)MDIGetActive()->GetActiveView()->GetDocument();

    nicht funzen weil kein Document activ bzw. vorhanden ist.

    jetzt denk mal ganz scharf nach was macht man wenn man nichts hat........

    man erstellt sich ein neues Document 😉

    folgendes hab ich in der MainFrame stehn und es funzt einwandfrei 😉

    [b]CDocument *pDoc = new CDocument();[/b]
    
    CFrameWnd *frameWnd = ((CChangeViewsApp*)AfxGetApp())->m_pDocEditView->CreateNewFrame(pDoc, NULL);
    
    frameWnd->InitialUpdateFrame(pDoc, TRUE);
    

    new edit;
    nicht vergessen

    delete pDoc;



  • Danke für Deine Antwort.
    Das hatte ich auch schon ausprobiert

    CDocument *pDoc = new CDocument()

    Bei mir kommt dann folgende Fehlermeldung:

    MainFrm.cpp
    c:\.. ..\mainfrm.cpp(109) : error C2259: 'CDocument': Instanz von abstrakter Klasse kann nicht erstellt werden
            aufgrund folgender Member:
            "CDocument::~CDocument(void)": ist abstrakt
            d:\microsoft visual studio 8\vc\atlmfc\include\afxwin.h(4963): Siehe Deklaration von 'CDocument::~CDocument'
    

    Mein Beispiel oben habe aus der MSDN abgeleitet
    Dabei hat man natürlich bei jeder ansicht ein separates Document
    Bei Dir benutzt man dagegen nur ein einziges (wen ich das richtig sehe)



  • Bei Dir benutzt man dagegen nur ein einziges (wen ich das richtig sehe)

    hmmm meinst du damit das ich nur 1 document vom typ Formview aufmachen kann??

    also ich kann über die Mainframe ätliche Documente vom Typ Formview aufmachen, da hier ja das menu nicht wechselt. sofern du es nicht in der NewFormView wechselst.

    auch hab ich vc6 evtl macht das die vc8 nicht mehr mit new Document();.
    kömisch 😕



  • Ich hab's :xmas1:

    Neue Doc-Klasse erstellen zB CNewFormDoc abgeleitet von CDocument

    dann wir die neu Document-Klasse erstellt mit :

    CNewFormDoc *pDoc = new CNewFormDoc();
    

    in der C..App.cpp muss dann der Eintrag für Die CMultDocTemplate-Variable
    geändert werden auf :

    m_pDocFormView = new CMultiDocTemplate(IDD_FORMVIEW,
    				RUNTIME_CLASS(CNewFormDoc),
    				RUNTIME_CLASS(CChildFrame),
    				RUNTIME_CLASS(CNewFormView));
    

    Dann funktioniert es auch bei mir

    Vielen Dank für Eure Hilfe
    Gruß Linus


Anmelden zum Antworten