MDI-Document - Ansichten



  • Hallo Leute

    Neues Projekt neue Fragen.
    Ich habe noch nie an einem MDI-Projekt gearbeitet.
    Was die Literatur so bietet ist nicht gerade sehr viel.
    Auch wurden meine folgenden Fragen schon mehrfach gestellt ,
    jedoch nicht erschöpfend beantwortet.
    Also das Projekt erstellen und damit arbeiten ist ja gar nicht so sehr das Problem.
    Aber nun möchte ich neue Fenster öffnen welche jedoch jedes eine ander Ansichtsart hat ,
    wie zB HTMLView orde Formview.
    Ich habe das nun so weit verstanden , dass man dazu jeweils eine eigene
    Documentklasse erstellen und dazu entsprechend eine View-Klasse .
    Frag ist nur: wie erstelle ich diese Klassen?

    Vielleicht hat ja jemand ein gutes Tutorial oder BUch wo das entspechend erklärt wird,
    auf jedenfall wäre ich für Eure Hilfe sehr dankbar.

    Danke und Gruß
    Linus



  • hab das mal schnell aus nem anderen thread kopiert wo ich darauf geantwortet hab der lag glaub ich auf der zweiten seite ganz unten 😉

    geh in dein MDI Project und erstell dir unter Arbeitsbereich/Resourcen/Dialog einen neuen FormViewDialog (IDD_FORMVIEW). Rechte Maustaste auf den Dialog und öffne den Klassenassi und erstelle für den FormViewDialog eine neue klasse (CNewFormView) achte aber darauf das du die neue klasse nicht von CDialog ableitest sondern von CFormView.

    geh jetzt in die Menuleiste des MFC Einfügen/Neue Klasse und erstell dir eine weiter neue Klasse (CNewEditView) diese leitest du von CEditView ab.

    Geh jetzt in die C....App.cpp klasse deiner Anwendung. als erstes includest du jetzt die Header der gerade erstellten klassen. unterhalb der vorhandenen include dateien.

    mach jetzt die C....App.h auf und erstell zwei variablen

    CMultiDocTemplate* m_pDocFormView;
    CMultiDocTemplate* m_pDocEditView;
    

    in der C...App::InitInstance() schreibst du unter

    CMultiDocTemplate* pDocTemplate;
    pDocTemplate = new CMultiDocTemplate(
    .....);
    AddDocTemplate(pDocTemplate);

    m_pDocFormView = new CMultiDocTemplate(
    		[b]IDD_FORMVIEW[/b],//<--hier gegebenen fals die ID deklaration eures Dialoges eintragen
    		RUNTIME_CLASS(C.....Doc),//<--Hier die Documentklasse eures Projectes eintragen
    		RUNTIME_CLASS(CChildFrame), 
    		RUNTIME_CLASS( [b]CNewFormView[/b]));//<--hier die Neu erstellte Klasse eintragen
    //	AddDocTemplate(m_pDocFormView);
    
    	m_pDocEditView = new CMultiDocTemplate(
    		IDR_CHANGETYPE,//<-- hier könnte man ein neues Menu eintragen
    		RUNTIME_CLASS(C....Doc),),//<--Hier die Documentklasse eures Projectes eintragen
    		RUNTIME_CLASS(CChildFrame), 
    		RUNTIME_CLASS( [b]CNewEditView[/b]));//<--hier die Neu erstellte Klasse eintragen
    //	AddDocTemplate(m_pDocEditView);
    

    unter Arbeitsbereich/Resourcen/Menu unter Ansicht (oder wo es dir beliebt) erstellst du zwei neue Button
    IDC_FORMVIEW //Beschriftung Form View
    IDC_EDITVIEW //Beschriftung Edit View

    in der Haupt C...View.cpp deiner Anwendung erstellst du jetzt für die 2 Button in der Menuleiste ein COMMAND Funktion.

    in die OnEditview() Funktion schreibst du

    CDocument *pDoc = (CDocument*)GetDocument();
    CFrameWnd *frameWnd = ((C....App*)AfxGetApp())->[b]m_pDocEditView[/b]->CreateNewFrame(pDoc, NULL);
    frameWnd->InitialUpdateFrame(pDoc, TRUE);
    

    in die OnFormview() funktion schreibst du

    CDocument *pDoc = (CDocument*)GetDocument();
    CFrameWnd *frameWnd = ((C....App*)AfxGetApp())->[b]m_pDocFormView[/b]->CreateNewFrame(pDoc, NULL);
    frameWnd->InitialUpdateFrame(pDoc, TRUE);
    

    danach sollten die verschieden view's je nach button klick aufgehn.

    NEW EDIT:
    erstell die button im Menu aber nicht im MainFrame menu



  • Danke für die Antwort.

    Ich habe versucht DeinerAnweisung zu folgen . Dabei habe ich nur 3 Probleme/Fragen:

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

    Mein Compiler streikt bzgl CChangeViewsDoc: Keine Klasse oder Namespace

    in der Haupt C...View.cpp deiner Anwendung erstellst du jetzt für die 2 Button in der Menuleiste ein COMMAND Funktion

    Mein Projekt hat nur folgende Klassen:
    CmditestApp
    CmditestDoc
    CmditestView
    CNewFormView
    CMainFrame
    CChildFrame
    CAboutDlg

    Was meinst Du mit Haupt C...View.cpp?
    Wenn ich in CmditestView eine COMMAND-Funktion erstelle so sind
    dort jedoch die Membervariablen m_pDocEditView und m_pDocFormView nicht bekannt.

    // AddDocTemplate(m_pDocFormView);

    Warum hast Du diese Zeile herausgenomen?

    Danke für Deine Hilfe
    Gruß Linus



  • 1:

    Mein Compiler streikt bzgl CChangeViewsDoc: Keine Klasse oder Namespace

    upps sorry mein fehler
    hier gehört in deinem fall CmditestDoc hin und für IDD_FORMVIEW must du die ID deklaration deines dialoges eintragen.

    2:

    Was meinst Du mit Haupt C...View.cpp?

    das wäre bei dir die CmditestView
    somit auch die button funktion in diese classe

    Wenn ich in CmditestView eine COMMAND-Funktion erstelle so sind
    dort jedoch die Membervariablen m_pDocEditView und m_pDocFormView nicht bekannt

    doch sind sie da du sie in der C...App.h erstellen sollst das wäre bei dir die CmditestApp und diese wird bei dir in der CmditestView.cpp unterhalb der StdAfx.h includet sollte bei dir #include "mditest.h" heisen

    //AddDocTemplate(m_pDocFormView);
    Warum hast Du diese Zeile herausgenomen?

    schalt sie an und du wirst sehn was passiert 😉 LOL nein die function AddDocTemplate sorgt dafür das beim start deines progs. die standart seite aufgeht. und zwar die in der C...App unter pDocTemplate deklariert wurde. wenn du nun mehrer MultiDocTemplates an die funktion AddDocTemplate übergibst kommt bevor dein prog startet ein kleiner dialog in dem du wählen kannst welche seite als erstes erscheint. das wollte ich dir ersparen. aber wie gesagt probier es einfach mal aus 😉

    NEW EDIT:
    mir ist da noch was aufgefallen
    hier in dieser zeile bei den buttonfunktionen

    CFrameWnd *frameWnd = (([b]C....App[/b]*)AfxGetApp())->
    

    mist du C....App mit deiner klasse CmditestApp austauschen



  • Klappt prima
    genau das was ich suchte

    Vielen Dank
    Linus


Anmelden zum Antworten