Dokumentvorlage wechseln

HolgerX

Mitglied
Da ich mit mehreren Dokumentvorlagen arbeite, muss ich beim Öffnen von Dateien darauf achten, welche Dokumentvorlage benutzt werden soll.
Normalerweise würde das Framework das machen, aber ich umgehe das durch eigene Öffnungsdialoge.

Wie kann ich nun z.B. auf die zweite Dokumentvorlage zugreifen?
Ich versuche es durch folgenden Code:
Code:
		CDocManager* pManager = AfxGetApp()->m_pDocManager;
		POSITION pos = pManager->GetFirstDocTemplatePosition();
		CDocTemplate* pTemplate = pManager->GetNextDocTemplate(pos);
		if(zweite Dokumentvorlage benötigt) {	
			pTemplate = pManager->GetNextDocTemplate(pos);
		}
		pTemplate->OpenDocumentFile( Dateiname);

Aber das klappt irgendwie nicht.
 
Das Framework erkennt das eigentlich automatisch, wenn du die Datei-Extensionen für die verschiedenen Dateitypen korrekt angepasst hast, jedenfalls sollte das gehen, wenn du die CWinApp::OpenDoc...-Variante verwendest. Sieh mal in der Stringtable nach, was da für die Doc-Typen steht (die Ressourcen-ID ist dieselbe wie bei beim Konstruktor innerhalb der InitInstance().

In deinem Code oben verwendest du übrigens die Template-spezifische Variante CMutliDocTemplate::OpenDingsda(). Nimm mal die andere von CWinApp.

Sorry für Tippfehler, Zeit knapp.
 
Zuletzt bearbeitet:
Den Code-Schnipsel, den du gezeigt hast, in deiner CWinApp-Klasse in OpenDocumentFile einsetzen und direkt das CDocument*, das von pDocTemplate->OpenDocumentFile zurückkommt, zurückgeben.

CWinApp kümmert sich dann um den Rest.
 
So, ich muss mal wieder eine Änderung vornehmen, da ich meinen Assistent in seinen früheren Aussagen falsch gedeutet habe. :mad:

Jetzt soll jede Dokumentvorlage automatisch durch das Framework erkannt werden. - D.h. ich soll für jede unterschiedliche Datei eine eigene Dokumentvorlage erstellen.

Wie bringe ich das Framework nun dazu, dass es bei z.B. einer TIF-Datei die Vorlage für TIF-Dokumente und bei einer BMP-Datei die Vorlage für BMP-Dokumente nimmt.

Wo kann man das angeben?
Bei Erstellung des Projekts konnte man (so glaube ich mich zu erinnern) irgendwo den Dateitypen angeben. - Wie und wo kann man das bei neuen Dokumentvorlagen?

Ich denke mal man müsste das bei den Ressourcen im StringTable machen, aber wie?
 
Soweit ich mich noch erinnern kann, kann man einen Dokumenttyp nur beim Erstellen der Applikation im Wizard anlegen. Danach muss man es immer per Hand machen. Ist aber gar nicht sooo schwer:

Zum einen gibt es da den von dir schon entdeckten String-Table-Eintrag, der sich aus mehreren Teilstrings zusammensetzt. Die MSDN erklärt das einfach besser als ich, suche nach dem Constructor von CMultiDocTemplate.

Das andere ist dann, eine jeweils passende Klasse für Document und View anzulegen und das neue DocTemplate wie gehabt anmelden (AddDocTemplate). Bei diesem AddDocTemplate muss dann natürlich die Resource-ID des zugehörigen Strings angegeben werden (Doh!).

Von deinem Projekt klingt das ja furchtbar aufwendig, wäre es denn machbar, das mehrere Datei-Formate von ein und denselben Dokument abgefackelt werden?
 
Hhmm, das bringt mich jetzt immer noch nicht richtig weiter.:(

Jedes Dateiformat muss von einem eigenen Dokumenttyp behandelt werden!

Das Problem, das ich jetzt sehe ist nun folgendes:
Ich kann eine Ressource (in diesem Fall mein Menü) per AddDocTemplate einem Dokument zur Verfügung stellen. Diese Ressource kann ich auch den String
Code:
\nTIFDatei\nTIFDatei\nDokument (*.tif)\n.tif\nTIFDatei.Document\n TIF Dokument
als Titel in der String Table zuweisen.

Aber ich will ja allen meiner Bildformate die gleiche Ressource (also das gleiche Menü) zur Verfügung stellen.
Muss ich jetzt das Menü für jedes Bildformat einmal im Ressourceneditor kopieren und danach jedem einen anderen Titel geben?:eek:

Das kann doch nicht der Sache sein, oder?
 
Das ist einer der Haken an den ganzen Doc-Templates. Da diese "schlauer"-weise für Menü, Accelerator und String dieselbe ID verwenden, bist du leider dazu gezwungen, das Menü auch so oft in den Ressourcen zu haben wie du Dokumenttypen hast.

Ich meine, dass man das Menü auch per Hand setzen könnte, aber ich bin mir ziemlich sicher, dass dir MFC beim Dokumentwechsel dazwischenpfuschen wird. Da müsste man dann auch noch auf das Dokument-Activate-Event achten und dann das Menü erneut setzen.

Ich sehe grade, das CDocument eine Memberfunktion GetDocString hat. Das ist nur eine Idee, aber du könntest beim AddDocTemplate trotzdem allen dieselbe ID geben, aber GetDocString überschreiben und für den Parameter CDocTemplate::filterExt deine eigene Extension reinpacken. Das heisst aber auch, dass du in deinem CDocTemplate wissen musst, für welches File-Format das jetzt gedacht ist. Hmmm...
 
Zurück