OnCreateClient benutzung macht Beispielprojekt-Speicherfunktion zunichte



  • Hallo, Ich bin MFC Anfänger. Ich hatte mir mehrfach die Beispiele von Visual Studio angeguckt, die man beim erstellen eines neuen MFC Projektes auswählen kann. Ich habe so ein ganz einfaches Startprojekt gemacht also ein "Einfaches Dokument" und überalle alle Haken weggemacht.
    Wenn man das Projekt dann startet erscheint ein Fenster mit Menüleiste und so, alles ganz schlicht. Man kann auch speichern, und wenn man gespeichert hat steht oben im rahmen der Name. Man kann auch wieder laden.

    Jetzt hatte ich diese CMainFrame klasse etwas verändert und mir zb ein splittwindow gemacht etc. Hat auch alles bestens geklappt. Bis ich gemerkt habe, dass diese Speicher und Ladefunktion nicht mehr funktioniert. das "speichern" und "speichern unter" ist ausgegraut.
    Nach einigen Test musste ich feststellen, dass dies sofort passiert sobald man in der CMainFrame die Funktion OnCreateClient hinzufügt, auch wenn dort garkein Inhalt ist.
    Ich frage mich jetzt warum das so ist und wie ich mein SplittWindow ansonsten in diesem Hauptfenster einbauen kann, ohne diese Funktion.
    Oder habe ich irgendwas grundlegendes nicht beachtet?

    was ich noch vergessen habe:
    in der hauptklasse Test.cpp steht ja die folgende Zeile:
    pDocTemplate = new CSingleDocTemplate(
    IDR_MAINFRAME,
    RUNTIME_CLASS(CTestDoc),
    RUNTIME_CLASS(CMainFrame), // Haupt-SDI-Rahmenfenster
    RUNTIME_CLASS(CTestView));
    wenn ich in der CTestView im Konstruktor eine Ausgabe mache zb "view" dann erscheint diese Ausgabe halt auch nur wenn ich in CMainFrame nicht OnCreateClient benutze. Er geht also garnicht in die View rein dann. Ich verstehe nicht was OnCreateClient in der CMainFrame damit zu tun hat.

    Wäre toll wenn mir jemand helfen und mich aufklären könnte.
    Danke


  • Mod

    Du rufts die Basiskklasse von CMainFrame nicht auf!
    D.h. es wird kein CView erzeugt.
    D.h. weiterhin es gibt keinen ActiveView.
    Das wiederum bedeutet, dass das Comand Routing von View überdas Document nicht geht.
    Das heißt es gibt keinen Handler für Save/Load...

    mindestens das musst Du in Deinem OnCreateClient Handler einbauen:

    __super::OnCreateClient()
    


  • Ok danke, ich werds mal testen, aber habe (nachdem ich ein ganzes tutorial für MFC gemacht habe) entschieden mein programm nochmal komplett neu zu programmieren. Hatte glaub ich die Document/View Struktur noch nicht ganz richtig verstanden.


  • Mod

    Grundsätzlich solltest Du, wenn Du einen Handler überschreibst immer die Funktion in der Basisklasse aufrufen. Außer Du willst genau das nicht!

    Aber einfach nur eine leer Funktion bei OnOncreateClint einzubauen ist tücksich.

    Lies dir die TN021+TN022 zu Command Routing durch
    http://msdn.microsoft.com/en-us/library/a5skz46c(v=vs.80).aspx



  • EDIT: Ok ich habe es soweit hinbekommen, das es läuft wie ich es will, aber richtig kann das nicht sein.

    Bin mir nur noch sehr unsicher. ich gebe ja hier:

    pDocTemplate = new CSingleDocTemplate(
    		IDR_MAINFRAME,
    		RUNTIME_CLASS(CAuftragDoc),
    		RUNTIME_CLASS(CMainFrame),       // Haupt-SDI-Rahmenfenster
    		RUNTIME_CLASS(CAuftragView));
    

    an welche View im MainFrame sein soll.
    Wenn ich ich im Mainframe ein Splitwindow erstelle muss ich da ja angeben welche Views benutzt werden. Dann kommt CAuftragView von oben garnicht mehr zum Einsatz.

    Deswegen dachte ich eher man macht das SplitWindow in der CAuftragView. Aber das funktioniert nicht.
    Es läuft zwar jetzt aber ich würde es gerne auf korrekte Art und Weise programmieren 😕

    Ursprüngliche Nachricht:

    Ok ich habe jetzt wahrscheinlich doch eher eine grundlegende Frage, bin mir nicht so ganz sicher. Bin halt noch totaler Anfänger.
    mein Programm bzw das Hauptfenster soll so aussehen:
    http://s1.directupload.net/images/121018/vx52bovw.jpg

    Ich hatte es zwar vom Aussehen her schon so hinbekommen, allerdings bin ich das glaube ich völlig falsch angegangen was die Documenten/View Architektur angeht.

    Also rechts oben sind die Produkte, und die sind immer gleich bzw werden beim Start des Programms aus xml Dateien eingelesen. Links ist dann der Auftrag und man kann die Produkte mit Knopfdruck (Button rechts unten) einfach rüber kopieren. Als Object hat der Auftrag also einfach eine Liste mit Produkten, diesen Auftrag soll man dann abspeichern und später wieder laden können. rechts unten wird Informationen zum Produkt und die Buttons angezeigt.

    bisher hatte ich das ganze einfach in die CMainFrame reingequetscht. also dort ein splittwindow erstellt mit den Klassen leftWindow und rightWindow. rightWindow hat dann auch wieder ein SplittWindow bekommen. Aber auch den Anstoss zum Einladen der Produket habe ich in die OnCreate von der CMainFrame reingemacht.

    Aber das kann ja nicht so richtig sein. CMainFrame ist doch nur für das Rahmenfenster gedacht. das innere sind dann doch die views.
    Ich bin mir jetzt aber überhaupt nicht sicher wo ich das Splittwindow (bzw die beiden) erstelle.

    Alle Beispiele die ich mit SplittWindow im Internet bisher gefunden habe, waren ohne die Document/View Architektur.

    Also ich habe zb eine Auftrags.cpp, AuftragsDoc.cpp und eine AuftragsView.cpp, hier ist die view dann doch nur für das verantwortlich was auf der linken seite ist.

    pDocTemplate = new CSingleDocTemplate(
    		IDR_MAINFRAME,
    		RUNTIME_CLASS(CAuftragDoc),
    		RUNTIME_CLASS(CMainFrame),       // Haupt-SDI-Rahmenfenster
    		RUNTIME_CLASS(CAuftragView));
    

    Ich weiß jetzt überhaupt keinen Ansatz, wo und wie sage ich dass diese Auftragsview nur die linke seite ist, oder ist das sogar falsch? Muss ich das Splittwindow in der Auftragsview machen?
    oder muss das ganze sogar eine MDI Anwendung werden?


Anmelden zum Antworten