14.7 Beispiel einer MDI-Anwendung
Das folgende Beispiel enthält einige der vorher besprochenen Elemente. Der Code beschränkt sich auf das Wesentliche und hat neben den MDI-typischen Anweisungen keine weitere Funktionalität. Insbesondere kann über das Menü nichts gespeichert, beendet oder bearbeitet werden.
Das Hauptmenü enthält zwei Menüelemente: Datei und Fenster. Datei hat ein Untermenü mit den beiden Punkten Neu und Beenden. Fenster ist nach dem Start der Anwendung deaktiviert und wird erst beim Öffnen des ersten Subfensters aktiviert. Falls zur Laufzeit alle Subfenster geschlossen werden, muss Fenster auch wieder deaktiviert werden. Den dazu erforderlichen Code führen wir bei der Auslösung des Ereignisses MdiChildActivate aus, das nicht nur bei der Aktivierung, sondern zusätzlich auch beim Schließen eines Subfensters auftritt. Im Ereignishandler wird die Eigenschaft ActiveMdiChild überprüft: Sie liefert Nothing, wenn kein Subfenster geöffnet ist.
Das Schließen des MDI-Haupt- und der MDI-Subfenster erfordert die ausdrückliche Bestätigung des Anwenders innerhalb des Ereignishandlers von FormClosing des Subfensters. Wird bei einem Dialog Cancel angeklickt, verhindert das das Schließen als Ganzes. Ein zusätzlicher FormClosing-Ereignishandler für das Hauptfenster würde mit e.Cancel = True nach der Abarbeitung aller Subfenster starten.
Das Subfenster hat eine Menüleiste mit den Elementen Datei und Bearbeiten, die in das Menü des Hauptfensters integriert werden. Die einzelnen Menüelemente sollen nicht an das Untermenü angehängt, sondern konventionsgemäß platziert werden, d. h. zuerst Neu, dann Speichern und Speichern unter und zum Schluss Beenden, sowie Bearbeiten zwischen den Menüs Datei und Fenster. Erreicht wird das durch die entsprechenden Einstellungen von MergeAction und MergeIndex im Eigenschaftsfenster für die einzuhängenden Menüpunkte.
Das Menü Bearbeiten, das zur Menüleiste des Subfensters gehört, soll sich zwischen Datei und Fenster des Hauptfensters positionieren. Auch das wird durch die dazu erforderlichen Eigenschaftseinstellungen im Eigenschaftsfenster bewirkt.
Einen Nebeneffekt werden Sie feststellen, wenn Ihr Subfenster eine Menüleiste hat: Nach dem Zusammenführen wird im Subfenster auch dann die Menüleiste angezeigt, wenn sie aufgrund des Zusammenführens leer ist. Wenn Sie das stört, legen Sie für das ToolStripMenu-Objekt Visible=False fest.
Abbildung 14.3 Layout des Beispiels MDI
'...\MDI\MDI\Hauptfenster.vb |
Public Class Hauptfenster Private Sub Neu_Click(ByVal sender As Object, ByVal e As EventArgs) _ Handles Neu.Click Dim frm As New Subfenster(Me) frm.Show() End Sub Private Sub Anordnung(ByVal sender As Object, ByVal e As EventArgs) _ Handles Überlappend.Click, Nebeneinander.Click, Untereinander.Click If sender Is Überlappend Then Me.LayoutMdi(MdiLayout.Cascade) ElseIf sender Is Untereinander Then Me.LayoutMdi(MdiLayout.TileHorizontal) Else Me.LayoutMdi(MdiLayout.TileVertical) End If End Sub Private Sub Kind(ByVal sender As Object, ByVal e As EventArgs) _ Handles MyBase.MdiChildActivate Fenster.Enabled = ActiveMdiChild IsNot Nothing End Sub End Class
'...\MDI\MDI\Subfenster.vb |
Public Class Subfenster Private Shared Anzahl As Integer Sub New(ByVal haupt As Form) InitializeComponent() If haupt Is Nothing OrElse Not haupt.IsMdiContainer Then _ Throw New ArgumentException("Kein MDI-Fenster.") Me.MdiParent = haupt Anzahl += 1 Me.Text = "Dokument " & Anzahl End Sub Private Sub Schliessen(sender As Object, e As FormClosingEventArgs) _ Handles MyBase.FormClosing If Not Inhalt.Modified Then Return Dim erg As DialogResult = MessageBox.Show( _ "Beenden?", "Ende " & Text, _ MessageBoxButtons.OKCancel, _ MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) e.Cancel = erg <> Windows.Forms.DialogResult.OK End Sub End Class
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.