[MFC] Document / View - Load & Save

Geschenk

Grünschnabel
Hallo,

ich arbeite nun seit einiger Zeit mit C++, und habe auch Dialoge mit MFC bereits erstellt.
Nun bin ich an dem Punkt, an dem ich gern die Document-View-Architecture versuchen möchte.
Ich habe bereits nach kleinen Beispielen gesucht, in dem Daten eingelesen werden und in der CView abgeleiteten Klasse dargestellt werden.
Zu dem hätte ich nun eine Frage. Ich habe eine Klasse die einen bestimmten Daten-Typ einlesen kann, und eine MFC-Klasse (CWnd abgeleitet in der die Daten dargestellt/gezeichnet werden).
Angenommen ich benötige nur die CWnd abgeleitete Klasse (als Member Variable) und zwei Funktionen:
Load & Save, die beide den Datei-Namen als (verschiedene String-Typen) Parameter nehmen.

Wie würde ich dies in einer Document-View-Architecture implementieren ?
In der CDocument abgeleiteten Klasse, habe ich versucht die "OnOpenDocument(LPCTSTR)" Funktion zu überschreiben, und dort mit einigen Casts -> CView Klasse -> Funktion(en) aufzurufen.
Da das aber nicht ganz fehlerfrei läuft, und mir auch nicht als der richtige Weg erscheint (vor allem mit Multiple Documents), wollte ich mal nachfragen wie das am besten funktionieren würde.

Wie erwähnt habe ich meine eigene Klasse die einen Daten-Typ einliest und die CWnd abgeleitete Klasse die diesen korrekt darstellen kann. Daher ~glaube ich~ nicht, dass die CDocument::Serialize(CArchive&) die Funktion ist, die ich benötige, oder sehe ich das falsch ?!
Visual Studio 2015 Enterprise (Update 1)
 
Der View selber hat ja mit dem Laden/Speichern gar nichts am Hut.

Bei mir habe ich OnOpenDocument und OnSaveDocument überladen und dort meine Lade/Speicher-Routinen eingesetzt. Da beim Öffnen erstmal nur ein View existiert, habe ich mir den so erschlichen:

POSITION pos;

pos = GetFirstViewPosition();

pView = (CPainterFontView*)GetNextView( pos );

// Lade-Code hier

pView->OnInitialUpdate();
return TRUE;

Und damit kann man dan rumpörkeln. Sauber und elegant ist das bestimmt nicht, aber das ist der Rest von MFC auch nur bedingt. Es hat auf jeden Fall seit VS 2003 so funktioniert.
 
Danke, funktioniert einwandfrei.

Habe noch eine kleine Frage zur CView, da ich bis jetzt nur mit einer customized CFormView gearbeitet habe.
Ist es möglich die Scollbars (SB_BOTH) auszuschalten und zu verstecken ?
Habe bereits an mehreren Stellen versucht, das mit Code umzusetzen... jedoch scheint es die CView nicht zu kümmern.

ShowScrollBar(SB_BOTH, FALSE);
EnableScrollBar(SB_BOTH, ESB_DISABLE_BOTH);
//Interessiert die CView wohl nicht...

Weiter versucht:
- In PreCreateWindow die Flags verändert
- OnCreate überschrieben
- In OnInitialUpdate versucht sie auszuschalten

(OnSize ist überschrieben und es wird nicht CView::OnSize oder __super::OnSize aufgerufen)
 
In meinem Zeichenprogramm habe ich den scrollbaren View von ScrollableView abgeleitet. Da hat die Größe des (virtuellen) Inhalts bestimmt, ob das Fenster in der aktuellen Größe Scrollbars hat oder nicht.

Beim Festlegen der Größe des Inhaltes habe ich SetScrollSizes aufgerufen:

SetScrollSizes( MM_TEXT, CSize( Breite, Hoehe ) );

Dann habe ich die notwendige Größe des Rahmenfensters drumherum errechnet und das ParentFrame angepasst (so dass es genau groß genug ist, um die Scrollbars nicht anzuzeigen)
GetParentFrame()->SetWindowPos( &CWnd::wndTop, 0, 0, iWidth, iHeight, SWP_NOMOVE );

D.h. im Grunde hat ScrollableView die Scrollbars von selbst deaktiviert (bzw. auch wieder aktiviert, falls notwendig)

Das ist vermutlich nicht ganz das, was du brauchst, vielleicht hilft es aber.
 
Das mit den SetScrollSizes weiß ich... suche aber vorerst für die CView eine Lösung :|
Ich werd mal versuchen den Inhalt ein wenig kleiner ausfallen zu lassen. Sollte ja kein Problem sein, da dieser ja eigentlich eigene Scrollbars besitzt... danke soweit.
 
Zurück