SDI oder MDI ????????????
-
Hi...
Ich habe folgendes Problem:
Normalerweise habe ich immer "nur" Win32-Applikationen für OpenGL erstellt und musste mich nicht mit irgendwelche Windows-Geschichten herumplagen...
Jetzt muss ich, beruflich bedingt, ein sehr grosses Projekt mit MFC umsetzen. Das neue Programm soll gleichzeitig mehrere nicht-modale Client-Fenster darstellen. Zum Beispiel gibt es ein Edit-Fenster zum Editieren eines Skriptes (es kann aber immer nur ein einziges Edit-Fenster sichtbar sein), ein Status-Fenster mit bestimmten Informationen, ein Fenster für die graphische Darstellung von Kurven, etc.
Ich frage mich nun die ganze Zeit, ob ich nun eine SDI oder eine MDI-Anwendung implementieren soll. Einerseits sollen alle offenen Fenster des Programms, Dialoge ausgeschlossen, in einem Client-Bereich eines übergeordneten Fensters angezeigt werden (spricht für eine MDI-Anwendung), andererseits kann jeder "Fenster-Typ" nur einmal existieren (spricht für eine SDI-Anwendung). Ich bräuchte also keine "Universal-Schablone", da jede Fensterklasse "einmalig" ist...
Toll ist aber, dass bei einer MDI-Anwendung ein paar Sachen automatisch funktionnieren... Zum Beispiel gibt es einen Mechanismus, dass eine Recent-File-List im Menü erzeugt wird. Aber ich möchte mich so wenig wie möglich mit Windows rumärgern (habe ich bereits genug gemacht!), so dass eine MDI-Anwendung evtl. zu viel Zeit kosten könnte...Ich habe das Projekt schon als SDI-Anwendung angefangen und überlege nun, ob ich mir die Mühe mache es in eine MDI-Anwendung zu konvertieren (Copy&Pase in ein neues Projekt)... Momentan ist das Projekt noch nicht so weit fortgeschritten...
Kann ich, ohne zu tricksen (!), mein Projekt als SDI-Anwendung realisieren? Ich brauche eigentlich nur die Eigenschaft eines Client-Bereiches, so dass alle "Unter-Fenster" automatisch im Hauptfenster angeordnet werden...
Aber da geht es ja schon wieder los: Eine SDI-Anwendung besitzt im Visual-Studio (6.0) keinen Automatismus zum anordnen mehrerer Fenster (v.w. "überlappend", "nebeneinander",...)...Danke
-
SDI / MDI hat NIX mit Fenstern zu tun !!
Es sagt nur, dass man nur 1 beziehungsweise mehrere Dokumente geöffnet haben kann.
Für Deine Zwecke würde ich ein SDI empfehlen.
Die einzelnen Fenster würde ich als Views implementieren, welche in ControlBars liegen, also andockbar oder floating sind, wie in der VC-Umgebung.
-
Falls Du nicht mit Controlbars arbeiten willst, würde ich vorschlagen, du gibst dem Anwender verschiedene Styles vor, wie die verschiedenen Views innerhalb des Parents liegen können.
Denn wenn der Anwender jedesmal seine Views neu zurechtschieben muss, wie das bei MDI mit verschiedenen MDIChilds der Fall wäre, wird das schnell nervig.
-
Original erstellt von RenéG:
**SDI / MDI hat NIX mit Fenstern zu tun !!Es sagt nur, dass man nur 1 beziehungsweise mehrere Dokumente geöffnet haben kann.
Für Deine Zwecke würde ich ein SDI empfehlen.
Die einzelnen Fenster würde ich als Views implementieren, welche in ControlBars liegen, also andockbar oder floating sind, wie in der VC-Umgebung.**Danke für Antworten!
Ich programmiere schon seit Jahren in C++ und kenne mich auch ganz gut im Visual-Studio aus. Wie schon gesagt: Bisher immer OpenGL oder Dialog-Anwendungen. Daher ist mein Wissen über SDI- und MDI-Anwendungen recht "bescheiden".
Ich muss deshalb noch einmal ein paar dumme Fragen stellen:Momentan habe ich ein wenig Schweine-Code implementiert... Ich habe mir mit dem Dialog-Editor einfach die "Client-Fenster" als Dialoge erzeugt und lasse diese mit "ShowWindow" nicht-modal im Hauptfenster anzeigen. Auf diese Weise habe ich meine "Fenster im Fenster"... Dummerweise gibt es bei dieser Trickserei aber Probleme mit der Nachrichtenverarbeitung in den Dialogklassen...
Nun will ich es vernünftig realisieren.
Ich habe gesehen, dass es sogn. Form-Views gibt. In ihnen könnte ich doch die Komponenten eines Fensters anordnen/erstellen.?!? Habe ich das jetzt richtig verstanden, dass ein FormView so etwas wie ein Dialogfenster ist, nur dass es halt ein "normales Fenster" ist?Wie meinst du das mit den "Views, die in ControlBars" liegen? Kann ich praktisch FormViews erstellen und diese in Control-Bars anzeigen lassen? Brauche ich dann nur Instanzen von der Klasse Control-Bar im CMainFrame erzeugen?
Wie gesagt: Ich habe momentan noch keinen richtigen Durchblick...
-
Wenn Deine Views alles 'Dialoge' sind, also mit dem Resourceneditor erstellt, hast Du es noch einfacher vom Programmieraufwand her.
Du erstellst einfach mit dem Klassenassistenten Deine Klassen, welche von CControlBar abgeleitet sind. Danach benennst Du die Basisklasse CControlbar nach CDialogBar um und gibst ihr die ID Deiner Resource. Dieser Umweg ist deshalb notwendig, da der MFC-Klassenassistent CDialogBar nicht als Basisklasse vorschlägt.
So, Deine CDialogbars sind jetzt ganz 'normale' Dialoge, nur dass sie halt andockbar sind und innerhalb des Mainframe liegen.Achja, wie man die Dialogbars erstellt, findest Du in der MSDN. Ist sehr ähnlich den normalen Toolbars.
-
Original erstellt von RenéG:
**Wenn Deine Views alles 'Dialoge' sind, also mit dem Resourceneditor erstellt, hast Du es noch einfacher vom Programmieraufwand her.
Du erstellst einfach mit dem Klassenassistenten Deine Klassen, welche von CControlBar abgeleitet sind. Danach benennst Du die Basisklasse CControlbar nach CDialogBar um und gibst ihr die ID Deiner Resource. Dieser Umweg ist deshalb notwendig, da der MFC-Klassenassistent CDialogBar nicht als Basisklasse vorschlägt.
So, Deine CDialogbars sind jetzt ganz 'normale' Dialoge, nur dass sie halt andockbar sind und innerhalb des Mainframe liegen.Achja, wie man die Dialogbars erstellt, findest Du in der MSDN. Ist sehr ähnlich den normalen Toolbars.**
Klasse!
Ich werde deinen Vorschlag gleich mal ausprobieren...Danke erstmal...
-
Hmmm... CControlBar wird bei mir nicht im Klassen-Assistenten aufgelistet
-
Was wäre es dann wenn man jetzt mal ohne den Assitenten ne MFC Anwendung erstellt und in ihr Fenster benutzt also keine Dialoge.
CFrameWindow ist Hauptfenster. Was ist des dann SDI oder MDI nix oder, hat doch nix damit zu tun oder.
Wie kann man das dann näher sagen, SDI entwickelt man halt so dass man einfach ein dokument offen haben kann und bei mdi halt des gegenteil.
Aber sagen wir mal ich benutzt nicht CDocument und so und mann kann z.B. trotdem noch mehrere Dokumente öffnen . wie nennt man das denn? MDI?
-
@Nitromaus
Sind halt so Standards, an die man sich halten sollte, wenn man dies oder jenes vorhat.
Ist halt schon schwierig, sich als Anwender in ein Programm einzuarbeiten, welches mehrere Dokumente gleichzeitig öffnen kann, man aber nicht in der Lage ist, z.B. mit Ctrl+Tab zwischen diesen umzuschalten.Schade ist natürlich, dass der MFC-Assistent keine Anwendungs-Unterstützung ausserhalb SDI/MDI/Dialoge gibt. Aber logischerweise gibts da noch mehr. Denken wir nur an den Explorer. Einen speziellen Namen kenn ich dafür allerdings nicht.
-
Der Explorer müsste dann so eine ähnliche Variante sein wie ich meine, die kein SDI und MDI benutzt.
Naja es sind aufjedenfall nur standarts gut. Is einfach ein bissl verwirrend.