Dialog(klasse) mehrfach als Teil weiterer Dialoge verwenden
-
Hallo Zusammen,
ich benötige einen Dialog (z.B. zwei Editfelder mit Rahmen und Beschriftung), der von anderen Dialogen desselben Programms verwendet werden kann (z.B. mehrere Dialoge verwenden die beiden Editfelder mit Beschriftung und Rahmen). Im Idealfall wäre jede Verwendung quasi mit einem eigenen Objekt (Instanz der Dialogklasse) verknüpft, so das die Editfelder in jedem Dialog, in dem sie aufgerufen werden eigene Werte annehmen können.
Sinn des ganzen ist es a) die mehrfach verwendeten Dialogteile (inkl. Funktionalität) nur einmal für alle Dialoge erstellen zu müssen und b) falls sich etwas an diesen Dialogteilen ändert, die Änderung auch nur einmal machen zu müssen. Geht das mit der MFC und falls ja, wie?
-
Ich stell' mir das so ähnlich vor wie im Fall der TabCtrls. Da wird ja auch ein Dialog von einem anderen (abhängig vom gewählten Tab) aufgerufen...
Bin für jeden Tip dankbar!
-
Du kannst auch in der MFC ein Usercontrol machen, dass du in beliebigen Dialogen verwenden kannst. Das erfüllt deine Anforderung an Wiederverwendbarkeit. Um das zu machen erstellst du eine neue Dialogresource die den Style "Child" hat, keinen Rahmen und keine Titelleiste.
Du erstellst dann ganz gewöhnlich eine Dialogklasse für diese Resource und programmierst die gewünschte Funktionalität.
Jetzt hast du einen Hauptdialog, der dieses Usercontrol verwenden soll. Im OnInitDialog erzeugst du dann das Usercontrol:
m_UserControl.Create(CMyUserControl::IDD, this); m_UserControl.MoveWindow(rc, TRUE);
Wobei CMyUserControl die Klasse deines Usercontrols ist und rc ein CRect wo das Usercontrol hin soll. m_UserControl definierst du im Header des Hauptdialogs.
Jetzt musst du nur eine Schnittstelle bereitstellen um das Usercontrol mit Daten zu füllen bzw. Daten vom Usercontrol zu lesen.
Alles klar?
-
Herzlichen Dank für die Erläuterung! Gute Idee!
Ich werd' das mal ausprobieren - allerdings ist mir noch nicht ganz klar wie ich das Rechteck definieren bzw. angeben soll.Ich stell mir das so vor:
Ich definiere mit Hilfe des Resourcen-Editors eine Dialogklasse mir den von Dir beschriebenen Modifikationen und erzeuge eine Klasse dazu. Im Hauptdialog erzeuge ich dann eine Instanz der Klasse und geb' diese beim Init an - die Position gebe ich in rc an - nur wie? Was genau ist rc?Und was genau meinst Du mit Schnittstelle? Benötige ich da noch etwas dialogspezifisches - ähnlich den tabctrl-Geschichten?
-
rc ist ein CRect. In deinem Hauptfenster definierst du einen Platzhalter in Form eines unsichtbaren CStatic (z.B.). Von diesem CStatic holst du dir die Position und die Abmessungen - GetWindowRect. An diese Position wird dann das Usercontrol gesetzt.
Mit Schnittstelle meine ich eine oder mehrere Funktionen die dein UserControl bereitstellt um Daten reinzuschicken bzw. abzuholen.
-
http://www.codeproject.com/Articles/5302/A-class-for-child-dialogs
http://www.codeproject.com/Articles/15/Child-Dialog-Sub-Forms
-
Vielen Dank nochmal an Alle - die child-Seiten mit Beispielen sind sehr hilfreich! Ich denke damit wird es klappen! Das scheint tatsächlich genau das zu sein, was ich gesucht habe! Super!