Dialog zur Eingabe der Seitenlänge eines Quadrates

Wenn in einer GUI-Anwendung Parameter eingegeben oder eingestellt werden sollen, dann werden dafür zumeist Dialoge verwendet. Das sind eigene zumeist kleinere Fenster, die sich öffnen, wenn der Anwender Parameter festlegen will. Sie kennen in vielen Anwendungen beispielsweise die Dialoge zum Öffnen oder zum Speichern der Daten in einer Datei.

Das Layout eines solchen Dialoges kann leicht mit grafischen Mitteln als Ressource erstellt werden.
[1] Kapitel 8, "Windows-Programme mit MFC, Dialogfelder und Steuerelemente", S. 307ff

Zur Oberfläche des Dialogfensters muss eine passende Dialogklasse erstellt werden, die von der Basisklasse CDialog abgeleitet wird. Hierzu sollte der Klassenassistent verwendet werden.
[1] Kapitel 8, "Windows-Programme mit MFC, Erstellen einer Dialogklasse", S. 311ff

Ein Dialog kann modal oder nichtmodal sein. Ein modaler Dialog muss erst geschlossen werden, bevor in der Applikation an anderer Stelle weitergearbeitet werden kann. Ein nichtmodaler Dialog gestattet ein Arbeiten an anderen Stellen der Applikation, während er geöffnet ist. Der Dialog zum Öffnen einer Datei ist beispielsweise modal. Sie können während dieser Dialog geöffnet ist nicht an anderen Teilen der Anwendung arbeiten. Probieren Sie das gelegentlich aus!

Dialoge sind in den allermeisten Fällen modal. Ihr programmiertechnischer Einsatz ist einfacher als der von nichtmodalen Dialogen. Hier wird im Folgenden nur auf modale Dialoge eingegangen.

Menüeintrag und Eventhandler

Damit der Anwender die Gelegenheit findet, der Applikation seinen Eingabewunsch mitzuteilen, wird zumeist in einem Menü der Menüleiste ein Eintrag hinzugefügt (Ressourceneditor!). Diesem Eintrag wird ein Nachrichten-Identifier zugeordnet, hinter dem sich eine ganzzahlige Nummer verbirgt. Sobald der Anwender diesen Menüeintrag aktiviert, wird eine Nachricht mit dieser ID-Nummer ausgesendet. Damit die Anwendung darauf reagiert, muss ihr ein passender Eventhandler zur Verfügung gestellt werden, der in der Eventhandler-Tabelle für die Nachricht als zuständig aufgenommen wird. Hierzu sollte ebenfalls der Klassenassistent verwendet werden, weil dieser die notwendigen Eintragungen vornimmt.

In diesem Eventhandler zur Erzeugung des erforderlichen Dialogs wird temporär der Dialog instanziiert. Bei Bedarf werden den Editiervariablen dieses Dialogs Werte zugewiesen. Dann wird der Dialog per Dialogmethode DoModal() geöffnet. Sobald der Anwender den Dialog mit der Übernahmetaste (typischer Name: OK) schließt, wird diese Methode verlassen. Das Dialogobjekt existiert noch, ist aber nicht mehr sichtbar.

Im Eventhandler sind nun die im Dialog enthaltenen Werte zu verarbeiten. Häufig besteht diese Verarbeitung in der Übernahme von Werten in Elementvariablen der Darstellungsklasse. Dabei müssen mitunter Konvertierungen vorgenommen werden. Hierzu bieten sich Einlese-Stringstreams der Standardbibliothek an. In vielen Fällen ist danach die Darstellung des aktuellen Fensters ungültig geworden, was mit dem Aufruf von Invalidate() kund getan wird. Als Folge dessen wird auch der Eventhandler OnPaint() aufgerufen.

Sobald der Eventhandler verlassen wird, wird auch das dort lokale Dialogobjekt entfernt. Das ist im Prinzip schon alles.

Zusammenfasung der Arbeitsschritte

  1. Mit dem Ressourceneditor die Dialogoberfläche erstellen.
  2. Mit dem Klassenassistenten die Dialogklasse erstellen (kann vom Ressourceneditor aus aktiviert werden).
  3. Mit dem Ressourceneditor einen Menüeintrag erzeugen und einen Nachrichten-ID-Bezeichner zuweisen.
  4. Mit dem Klassenassistenten in der verantwortlichen Klasse (beispielsweise CChildView) einen Eventhandler zu obiger Nachrichten-ID anlegen und dessen Rumpf füllen (Quelltextarbeit mit dem wirklich wichtigen Know How ;-).

Eine dazu passende Übung finden Sie unter Streams für Strings.