MDI: View nach Dateiendeung...



  • Hallo,

    ein MDI-templete erzeugt ja für jedes geöffnete Dokument ein neues CDokument und eine neue View (CChildView).

    Wie kann ich meine View abhängig vom Dateitypen machen?

    Also z.B:

    Dateiendung - View-Klasse
    .abc | CabcView
    .def | CdefView
    etc...

    Also ich möchte praktisch für verschiedene Dateitypen eine andere View-Klasse als Ansicht benutzen.

    Jemand eine AHnung wie man das macht?

    Gruß Stu


  • Mod

    Dann erzeuge unterschiedliche Doctemplates mit den entsprechenden Endungen und Views. Registriere sie alle und danach wird Deine MDI Applikation beim Datei öffnen Dialog die neuen Typen anbieten und auch die Datei für das entsprechende Doc/View paar öffnen.



  • Ahso, dann erzeuge ich mir nen Frame,View,Doc und adde das AddDocTemplate.

    CMultiDocTemplate* pDocTemplate;
    	pDocTemplate = new CMultiDocTemplate(
    		IDR_MDITYPE,
    		RUNTIME_CLASS(CMDIDoc),
    		RUNTIME_CLASS(CChildFrame), // custom MDI child frame
    		RUNTIME_CLASS(CMDIView));
    	AddDocTemplate(pDocTemplate);
    

    Ich vermute mal, die Dateiendung wird mit CDocTemplate::MatchDocType eingeben, aber diese funktion ist ja eine "Overridable".

    Ist diese Funktion überhaupt richitg? hat jemand eine Ahnung wie das einfügen/verknüpfen von Dateiendungen in der Praxis funktioniert?



  • is schon ne weile her das ich das mal gemacht hab bestimmt gibts da noch ne galantere lösung.

    in der header deiner ..App classe erstellst du ne variable vom typ
    CMultiDocTemplate

    CMultiDocTemplate* m_pMyNewForm;
    

    in der cpp der app classe schreibst du unterhalb der ersten CMultiDocTemplate erstellung

    CMultiDocTemplate* pDocTemplate;
        pDocTemplate = new CMultiDocTemplate(
            IDR_MDITYPE,
            RUNTIME_CLASS(CMDIDoc),
            RUNTIME_CLASS(CChildFrame), // custom MDI child frame
            RUNTIME_CLASS(CMDIView));
        AddDocTemplate(pDocTemplate); 
    
    m_pMyNewForm = new CMultiDocTemplate(
    		IDD_NEUERDIALOG_DLG,
                RUNTIME_CLASS(CMDIDoc), 
                RUNTIME_CLASS(CChildFrame), 
                RUNTIME_CLASS(CNeuerDialogDlg));//<--- is bei mir ne FormView
    AddDocTemplate(m_pMyNewForm);
    

    dort wo du dein neues document öffnen willst schreibst du dann

    CDocument *pDoc = (CDocument*)GetDocument();
    CFrameWnd *frameWnd = ((CMDIApp*)AfxGetApp())->m_pMyNewForm->CreateNewFrame(pDoc, NULL); 
    frameWnd->InitialUpdateFrame(pDoc, TRUE);//Öffnet neues Document mit der CFormView
    

    is natürlich egal was du für ne ...View nimmst. geht mit jeder.
    hab den code jetzt nicht getestet wie gesagt is schon ne weile her das ich das gemacht hab sollte aber so funzen

    mfg
    LowFly



  • ah danke , das Darstellen des Frames Funktioniert.

    Nur müsste für den neuen Frame kein "Neus Dokument" erzeugt werden?

    Denn bei der beschreibung von den Parametern von "CreateNewFrame" steht :
    pDoc: The document to which the new frame window should refer. Can be NULL.

    D.h mann kann da nen zeiger angeben, auf das zugehörige CDokument zeigt, aber mit "CreateNewFrame" müsste doch ein neues Erzeugt werden?

    Wo ruft man denn "CreateNewFrame" auf. Denn wenn man das im MainFrm macht, kann man ja schlecht die GetDokument Funktion benutzen?


Anmelden zum Antworten