Motivation

Das .NET-Framework bietet zwei Möglichkeiten, ein Nachrichtenfenster anzuzeigen: die Methode MsgBox() und die Klasse MessageBox. Für einige Anwendung fehlten jedoch weitere Eigenschaften, wie z.B. eine bessere Positionierungsmöglichkeit oder eine Option, die Box asynchron schließen zu können. Nicht zuletzt soll der Anwender die Möglichkeit haben, die Nachricht irgendwie versenden zu können, um z.B. bei einer Benachrichtigung über einen Fehler Unterstützung anfordern zu können.

Die Klasse UrsExtendedMsgBox bietet diese Möglichkeiten.

ExtendedMsgBox

Download

Verwendung

Es gibt zwei Möglichkeiten, ein erweitertes Nachrichtenfenster anzuzeigen. Diejenige, die auch die Option bietet, Fenstereigenschaften während der Anzeige zu verändern und Ereignisse abzufangen ist, eine Instanz der Klasse UrsExtendedMsgBox anzulegen und über diese das Nachrichtenfenster zur Ansicht zu bringen. Über diese Instanz können dann auf die Methoden und Ereignisse der Klasse zugegriffen werden.

Die zweite Möglichkeit ist die Nutzung der Funktion MsgBoxEx(…), die in zwei Varianten zur Verfügung steht, ähnlich wie die MsgBox(…)-Funktion funktioniert und ein Nachrichtenfenster direkt anzeigt. Diese Verwendung ist einfacher, erlaubt aber keinen Zugriff auf die Member der Klasse.

Nachrichtenfenster über Klasseninstanz

Über den Konstruktor der Klasse können sämtliche Einstellungen des Nachrichtenfensters vorgegeben werden.

Public Sub New(Prompt As String,
            Optional MsgType As MsgTypes = MsgTypes.Information,
            Optional Title As String = Nothing,
            Optional Buttons As ButtonList = ButtonList.OkOnly,
            Optional DefaultButton As DefaultButtons = DefaultButtons.Button1,
            Optional SoundType As SoundTypes = SoundTypes.None,
            Optional SoundStream As Stream = Nothing,
            Optional ShowCopyButton As Boolean = False,
            Optional ShowHelpButton As Boolean = False,
            Optional TopMost As Boolean = False,
            Optional IconSize As IconSizes = IconSizes.Icons32,
            Optional StartPosition As StartPositions = StartPositions.CenterParent,
            Optional Location As Point = Nothing,
            Optional Parent As Form = Nothing)

Für jede Einstellung existiert eine gleichlautende Eigenschaft, über die diese Einstellungen auch nach der Instanziierung angepasst werden können. Die Bedeutung der Parameter / Eigenschaften ist:

Konstruktor-Parameter/
Eigenschaft
Funktion / Wirkung Anmerkung
Prompt As String Die anzuzeigende Nachricht. Entspricht dem Parameter Prompt bei der Funktion MsgBox().
Optional MsgType As UrsExtendedMsgBox.MsgTypes

Art des zu verwendenden Symbols. Mögliche Angaben sind:

  •      None: Es wird kein Symbol angezeigt.
  • Information: Es wird das Symbol für Information angezeigt.
  • Important: Es wird das Symbol für Wichtig angezeigt.
  • Warning: Es wird das Symbol für Warnung angezeigt.
  • Error: Es wird das Symbol für Fehler angezeigt.
  • Question: Es wird das Symbol für Frage angezeigt.
Der Standardwert ist Information.
Optional Buttons As UrsExtendedMsgBox.ButtonList

Anzahl und Art der anzuzeigenden Schaltflächen. Mögliche Angaben sind:

  • OkOnly: Die Schaltfläche OK wird angezeigt.
  • OkCancel: Die Schaltflächen OK und Abbruch werden angezeigt.
  • AbortRetryIgnore: Die Schaltflächen Abbrechen, Ignorieren und Wiederholen werden angezeigt.
  • RetryCancel: Die Schaltflächen Wiederholen und Abbrechen werden angezeigt.
  • YesNo: Die Schaltflächen Ja und Nein werden angezeigt.
  • YesNoCancel: Die Schaltflächen Ja, Nein und Abbrechen werden angezeigt.
Der Standardwert ist OkOnly.
Optional DefaultButton As UrsExtendedMsgBox.DefaultButtons

Angabe der Standardschaltfläche. Mögliche Angaben sind:

  • Button1: Die erste Schaltfläche ist die Standard-Schaltfläche.
  • Button2: Die zweite Schaltfläche ist die Standard-Schaltfläche.
  • Button3: Die dritte Schaltfläche ist die Standard-Schaltfläche.
Wird eine nicht angezeigte Schaltfläche ausgewählt, erhält die erste Schaltfläche (Button1) den Focus.
Der Standardwert ist Button3.
Optional ShowHelpButton As Boolean Legt fest, ob auf der Titelleiste des Nachrichtenfensters die Hilfe-Schaltfläche angezeigt wird. Das Anklicken dieser Schaltfläche löst das Ereignis HelpButtonClicked aus.
Der Standardwert ist False.
OOptional TopMost As Boolean Legt fest, ob das Nachrichtenfenster als oberstes Fenster erscheinen soll. Der Standardwert ist False.
Optional Title As String Auf der Titelleiste des Dialogfelds angezeigter String-Ausdruck. Wenn Title nicht angeben wird, wird der Anwendungsname auf der Titelleiste platziert.
Entspricht dem Parameter Title bei der Funktion MsgBox().
Optional SoundStream As Stream Ein Stream-Objekt, das die Audiodatei darstellt (siehe SoundStream-Eigenschaft). Die Angabe wird benötigt, wenn der Parameter SoundType den Wert Manual besitzt.
Der Standardwert ist Nothing.
Optional ShowCopyButton As Boolean Legt fest, ob die Schaltfläche 'Meldung kopieren' angezeigt wird. Der Standardwert ist False.
Optional IconSize As UrsExtendedMsgBox.IconSizes

Größe des angezeigten Symbols. Mögliche Angaben sind:

  • Icons32: Symbolgröße 32 x 32 Pixel²
  • Icons64: Symbolgröße 64 x 64 Pixel²
Der Standardwert ist Icons32.
Optional StartPosition As UrsExtendedMsgBox.StartPositions

Legt die Anfangsposition des Nachrichtenfensters zur Laufzeit fest. Mögliche Angaben sind:

  • CenterParent: Das Nachrichtenfensters wird innerhalb des übergeordneten Formulars zentriert.
  • CenterScreen: Das Nachrichtenfensters wird in der aktuellen Anzeige zentriert.
  • Manual: Die Position des Nachrichtenfensters wird von der Location-Eigenschaft bestimmt.
Der Standartwert ist CenterParent.
Optional Location As Point Legt die Position der linken oberen Ecke des Nachrichtenfensters in Bildschirmkoordinaten fest, wenn der Parameter StartPosition den Wert Manual besitzt. Der Standartwert ist Nothing.
Optional Parent As Form Ein Control, das das übergeordnete Element oder das Container-Steuerelement des Nachrichtenfensters darstellt. Der Standartwert ist Nothing.

Die Eigenschaften können auch dann geändert werden, wenn das Nachrichtenfenster bereits angezeigt wird. Da das Nachrichtenfenster ein modales Dialogfeld ist, kann diese Anpassung nicht über den primären Thread erfolgen, der auch die Windows-Nachrichten-Schlange bedient, sondern muss über einen sekundären Thread geschehen. Das in der Solution enthaltene Test-Programm MsgBoxExTest, startet vor(!) dem Anzeigen des Nachrichtenfensters einen Timer, der nach drei Sekunden den Titel des Fensters ändert und nach weiteren drei Sekunden das Fenster asynchron schließt (s.u.).

Lediglich die Eigenschaft Buttons kann bei sichtbarem Fenster nicht geändert werden.

Zwei Methoden stehen zur Verfügung:

Methode Wirkung / Funktion Anmerkung
Function ShowDialog As DialogResult Zeigt das erweiterte Nachrichtenfenster an. Es wird ein modales Dialogfeld angezeigt.
Sub Abort Schließt das Nachrichtenfenster asynchron. Der Rückgabewert der Methode ShowDialog ist dann cancel.

Das Ereignis HelpButtonClicked wird ausgelöst, wenn die Hilfe-Schaltfläche in der Titelleiste des Nachrichtenfenster angeklickt wird.

Ereignis Wirkung / Funktion Anmerkung
HelpButtonClicked
As EventHandler
Wird ausgelöst, wenn in die Hilfe-Schaltfläche in der Titelleiste angeklickt wird. Hierzu muss die Eigenschaft ShowHelpButton auf True gesetzt werden.

Nachrichtenfenster über Direktaufruf

Die Funktion MsgBoxEx(…) wird durch ein Modul bereit gestellt. Die Funktion kann also ohne Klassenangabe aufgerufen werden. Der einfachste Aufruf erfolgt in der Form

MsgBoxEx("Hello World")

Einfache erweitere MsgBox

Die Ansicht und Funktion des Nachrichtenfensters kann durch weitere Parameter modifiziert werden:

Public Function MsgBoxEx(Prompt As String,
                         Optional MsgType As UrsExtendedMsgBox.MsgTypes = UrsExtendedMsgBox.MsgTypes.Information,
                         Optional Title As String = Nothing,
                         Optional Buttons As UrsExtendedMsgBox.ButtonList = UrsExtendedMsgBox.ButtonList.OkOnly,
                         Optional DefaultButton As UrsExtendedMsgBox.DefaultButtons 
                                                = UrsExtendedMsgBox.DefaultButtons.Button1,
                         Optional SoundType As UrsExtendedMsgBox.SoundTypes = UrsExtendedMsgBox.SoundTypes.None,
                         Optional SoundStream As Stream = Nothing,
                         Optional ShowCopyButton As Boolean = False,
                         Optional TopMost As Boolean = False,
                         Optional IconSize As UrsExtendedMsgBox.IconSizes = UrsExtendedMsgBox.IconSizes.Icons32,
                         Optional StartPosition As UrsExtendedMsgBox.StartPositions 
                                                = UrsExtendedMsgBox.StartPositions.CenterParent,
                         Optional Location As Point = Nothing,
                         Optional Parent As Form = Nothing) As DialogResult

Oder in der folgenden Form, in der die Parameter MsgType, Buttons, DefaultButton und TopMost analog zur MsgBox()-Funktion in einem Parameter (Style) zusammengefasst sind:

Public Function MsgBoxEx(Prompt As String,
                         Style As UrsExtendedMsgBox.MsgBoxExStyle,
                         Optional Title As String = Nothing,
                         Optional SoundType As UrsExtendedMsgBox.SoundTypes = UrsExtendedMsgBox.SoundTypes.None,
                         Optional SoundStream As Stream = Nothing,
                         Optional ShowCopyButton As Boolean = False,
                         Optional IconSize As UrsExtendedMsgBox.IconSizes = UrsExtendedMsgBox.IconSizes.Icons32,
                         Optional StartPosition As UrsExtendedMsgBox.StartPositions 
                                                             = UrsExtendedMsgBox.StartPositions.CenterParent,
                         Optional Location As Point = Nothing,
                         Optional Parent As Form = Nothing) As DialogResult
Parameter Funktion Anmerkung
Optional Buttons As UrsExtendedMsgBox.ButtonList

Anzahl und Art der anzuzeigenden Schaltflächen. Mögliche Angaben sind:

  • OkOnly: Die Schaltfläche OK wird angezeigt.
  • OkCancel: Die Schaltflächen OK und Abbruch werden angezeigt.
  • AbortRetryIgnore: Die Schaltflächen Abbrechen, Ignorieren und Wiederholen werden angezeigt.
  • RetryCancel: Die Schaltflächen Wiederholen und Abbrechen werden angezeigt.
  • YesNo: Die Schaltflächen Ja und Nein werden angezeigt.
  • YesNoCancel: Die Schaltflächen Ja, Nein und Abbrechen werden angezeigt.
Der Standardwert ist OkOnly.

Test-Programm

Solution enthaltene Test-Programm MsgBoxExTest, erlaubt es ein Nachrichtenfenster mit verschiedenen Eigenschaften aufzurufen. Vor der Anzeige des Nachrichtenfensters wird ein Timer gestartet. Dieser Timer ändert nach drei Sekunden den Fenstertitel und schließt nach weiteren drei Sekunden das Fenster automatisch.

Testprogramm MsgBoxExTest

Detail zur Programmierung

Das Nachrichtenfenster ist ein Standard-Windows-Fenster der Klasse InternalMsgBoxEx. Damit nicht alle Eigenschaften des des Fenster zur Änderung zur Verfügung stehen, wird die Instanziierung dieses Fensters außerhalb des Projekt durch den Zugriffsmodifizierer friend auf Klassenebene verhindert. Die Klasse UrsExtendedMsgBox ist ein Wrapper um diese Fensterklasse, der nur die vorgesehenen Eigenschaften und Methoden veröffentlicht.

Das Modul UrsExtendedMsgBoxModule veröffentlicht die Methode MsgBoxEx(…), die durch die Einbettung in ein Modul auch außerhalb des Moduls ohne Klassenbezeichnung aufgerufen werden können.