Rubrik: Oberfläche · MessageBox | VB-Versionen: VB2005, VB2008 | 29.03.10 |
Zugriff auf die modernen Messagebox-Dialoge, die mit Vista Einzug gehalten haben Mit Vista fand ein Einzug neuer Dialogdesigns statt, welche auf langer Sicht die herkömmlichen Messageboxen ablösen werden... | ||
Autor: Lars Konschak | Bewertung: | Views: 14.111 |
ohne Homepage | System: Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Mit Vista fand ein Einzug neuer Dialogdesigns statt, welche auf langer Sicht die herkömmlichen Messageboxen ablösen werden. Leider finden sich im Framework diese Designs noch nicht. Möchte man auf diese zugreifen, so muss man dafür auf eine dll aus dem Vista SDK bzw. aus dem Windows API Code Pack zurückgreifen. Will man aber ohne eine weitere dll auskommen (z.B. in einem Klassenbibliothekprojekt), so lässt sich das ganze ebenfalls per API realisieren.
Der API-Aufruf Private Declare Auto Function TaskDialog Lib "comctl32.dll" (ByVal ...) bietet uns die Möglichkeit, auf dieses Dialoge zuzugreifen. In diesem Beispiel liegt der Fokus auf die Dialoge mit dem Sicherheitsschild. Damit das ganze genauso bequem zu handhaben ist wie ein normaler Aufruf einer Messagebox, habe ich das ganze in eine Klasse mit dem Namen "MessageWindowDialog" verpackt.
Mit der Methode Show wird der Dialog aufgerufen. Diese Methode ist überladen.
Die Methode erwartet diverse Parameter wie die Überschrift, Nachrichteninhalt, Fenstertitel, anzuzeigende Buttons und das Icon.
Es es möglich, alle Parameter in einer Struktur mit dem Namen "MessageWindowData" zu erfassen und dieser der Methode Show zu übergeben. Natürlich können der Methode Show die Parameter auch einzeln übergeben werden.
Die auszuwählenden Button habe ich zu einem Enum mit dem Namen MessageWindowButton zusammengefasst.
Ein Auswählen mehrer Button ist mit OR möglich, da dieses Enum über das Flag Attribut verfügt.
Die Iconauswahl geschieht ebenfalls über ein Enum. Dieses lautet MessageWindowIcon.
Die Methode Show gibt ein Enum mit den Namen MessageWindowResult zurück, in welchem der vom Benutzer gewählte Button aufgeführt ist.
Das aufrufende Formular wird wie folgt präpariert:
Im Load-Ereignis des Formulares wird ein Button dynamisch erstellt und eine entsprechende Sub für das Click Ereignis des Buttons bereitgestellt.
Ein melden des vom Benutzer gedrückten Buttons erfolgt über die Methode UsedButton.
Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Me.Width = 300 Me.Height = 300 ' Button erstellen und auf dem Formular plazieren Dim btn As New Button With {.Text = "Demo"} AddHandler btn.Click, AddressOf ClickEvent btn.Top = (Me.Height - btn.Height) / 2 - (btn.Height / 2) btn.Left = (Me.Width - btn.Width) / 2 Me.Controls.Add(btn) End Sub
''' <summary> ''' Click Event des Buttons ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub ClickEvent(ByVal sender As System.Object, ByVal e As System.EventArgs) ' Die Parameter zum Dialogaufruf können einzeln oder ' als MessageWindowData Struktur übergeben werden. ' Aufgrund des Flagattributes können die gewünschten ' Buttons mit einer OR Verknüpfung ausgewählt werden. ' Unsere neuer Dialog Dim dialog As New MessageWindowDialog ' Teilt uns mit, welcher Button gedrückt wurde Dim result As MessageWindowDialog.MessageWindowResult ' Text vordefinieren, um die Aufrufbeispiele kompakter zu halten Dim WindowTitel As String = _ "Fensterüberschrift" Dim Instruction As String = _ "Hier findet sich die Anweisung" Dim Content As String = _ "An dieser Stelle kann weiterer Text angegeben werden" ' Anzeige aller Buttons. ' Der gewählte Button wird anschließend genannt result = dialog.Show(Me, "Alle Buttons", _ "Bitte einen Button auswählen", _ "Hier werden alle Button angezeigt", _ MessageWindowDialog.MessageWindowButton.OK Or _ MessageWindowDialog.MessageWindowButton.No Or _ MessageWindowDialog.MessageWindowButton.Cancel Or _ MessageWindowDialog.MessageWindowButton.Close Or _ MessageWindowDialog.MessageWindowButton.Retry Or _ MessageWindowDialog.MessageWindowButton.Yes, _ MessageWindowDialog.MessageWindowIcon.WithoutIcon) ' Gewählten Button durch eine Messagebox anzeigen UsedButton(result) ' Restliche Dialoge anzeigen dialog.Show(Me, WindowTitel, Instruction, Content, _ MessageWindowDialog.MessageWindowButton.OK, _ MessageWindowDialog.MessageWindowIcon.Error) dialog.Show(Me, WindowTitel, Instruction, Content, _ MessageWindowDialog.MessageWindowButton.OK, _ MessageWindowDialog.MessageWindowIcon.Information) dialog.Show(Me, WindowTitel, Instruction, Content, _ MessageWindowDialog.MessageWindowButton.OK, _ MessageWindowDialog.MessageWindowIcon.Question) dialog.Show(Me, WindowTitel, Instruction, Content, _ MessageWindowDialog.MessageWindowButton.OK, _ MessageWindowDialog.MessageWindowIcon.SecurityShield) dialog.Show(Me, WindowTitel, Instruction, Content, _ MessageWindowDialog.MessageWindowButton.OK, _ MessageWindowDialog.MessageWindowIcon.SecurityShieldBlue) dialog.Show(Me, WindowTitel, Instruction, Content, _ MessageWindowDialog.MessageWindowButton.OK, _ MessageWindowDialog.MessageWindowIcon.SecurityShieldError) dialog.Show(Me, WindowTitel, Instruction, Content, _ MessageWindowDialog.MessageWindowButton.OK, _ MessageWindowDialog.MessageWindowIcon.SecurityShieldGrey) dialog.Show(Me, WindowTitel, Instruction, Content, _ MessageWindowDialog.MessageWindowButton.OK, _ MessageWindowDialog.MessageWindowIcon.SecurityShieldSuccess) dialog.Show(Me, WindowTitel, Instruction, Content, _ MessageWindowDialog.MessageWindowButton.OK, _ MessageWindowDialog.MessageWindowIcon.SecurityShieldWarning) dialog.Show(Me, WindowTitel, Instruction, Content, _ MessageWindowDialog.MessageWindowButton.OK, _ MessageWindowDialog.MessageWindowIcon.Warning) End Sub
''' <summary> ''' Ruft ab, welcher Button gewählt wurde. ''' </summary> ''' <param name="r">MessageWindowDialog.MessageWindowResult</param> Private Sub UsedButton(ByVal r As MessageWindowDialog.MessageWindowResult) Select Case r Case MessageWindowDialog.MessageWindowResult.Cancel MessageBox.Show("Es wurde der Button " + """" + _ "Cancel" + """" + " gewählt", "Info", _ MessageBoxButtons.OK, MessageBoxIcon.Information) Case MessageWindowDialog.MessageWindowResult.Close MessageBox.Show("Es wurde der Button " + """" + _ "Close" + """" + " gewählt", "Info", _ MessageBoxButtons.OK, MessageBoxIcon.Information) Case MessageWindowDialog.MessageWindowResult.No MessageBox.Show("Es wurde der Button " + """" + _ "No" + """" + " gewählt", "Info", _ MessageBoxButtons.OK, MessageBoxIcon.Information) Case MessageWindowDialog.MessageWindowResult.None Case MessageWindowDialog.MessageWindowResult.OK MessageBox.Show("Es wurde der Button " + """" + _ "OK" + """" + " gewählt", "Info", _ MessageBoxButtons.OK, MessageBoxIcon.Information) Case MessageWindowDialog.MessageWindowResult.Retry MessageBox.Show("Es wurde der Button " + """" + _ "Retry" + """" + " gewählt", "Info", _ MessageBoxButtons.OK, MessageBoxIcon.Information) Case MessageWindowDialog.MessageWindowResult.Yes MessageBox.Show("Es wurde der Button " + """" + _ "Yes" + """" + " gewählt", "Info", _ MessageBoxButtons.OK, MessageBoxIcon.Information) End Select End Sub
Kernstück des Ganzen bildet die Klasse MessageWindowDialog.
''' <summary> ''' Zeigt Messageboxen an, die ab Vista Einzug ins ''' Betriebssystem genommen haben. ''' </summary> Public Class MessageWindowDialog
#Region "Deklarieren" ''' <summary> ''' Auswahl der Icons, die im MessageWindowDialog ''' angezeigt werden können. ''' </summary> Public Enum MessageWindowIcon WithoutIcon = 0 Information = UInt16.MaxValue - 2 Warning = UInt16.MaxValue [Error] = UInt16.MaxValue - 1 Question = 32514 SecurityShieldWarning = UInt16.MaxValue - 5 SecurityShieldError = UInt16.MaxValue - 6 SecurityShieldSuccess = UInt16.MaxValue - 7 SecurityShield = UInt16.MaxValue - 3 SecurityShieldBlue = UInt16.MaxValue - 4 SecurityShieldGrey = UInt16.MaxValue - 8 End Enum ''' <summary> ''' Vom User ausgewählten Button. ''' </summary> Public Enum MessageWindowResult None OK = 1 Cancel = 2 Yes = 6 No = 7 Retry = 4 Close = 8 End Enum ''' <summary> ''' Button, die dem MessageWindowDialog zur Verfügung stehen. ''' </summary> <Flags()> _ Public Enum MessageWindowButton OK = &H1 Cancel = &H8 Yes = &H2 No = &H4 Retry = &H10 Close = &H20 End Enum ''' <summary> ''' Nachrichteninhalt des MessageWindowDialoges. ''' </summary> Public Structure MessageWindowData ''' <summary> ''' Fenstertitel ''' </summary> Public WindowTitle As String ''' <summary> ''' Anweisung ''' </summary> Public Instruction As String ''' <summary> ''' Nachrichtentext ''' </summary> Public MessageContent As String ''' <summary> ''' Icon ''' </summary> Public Icon As MessageWindowIcon ''' <summary> ''' Anzuzeigende Buttons ''' </summary> Public Buttons As MessageWindowButton End Structure ' API Aufruf Private Declare Auto Function TaskDialog Lib "comctl32.dll" ( _ ByVal hWndParent As IntPtr, _ ByVal hInstance As IntPtr, _ ByVal WindowTitle As String, _ ByVal Instruction As String, _ ByVal MessageContent As String, _ ByVal CommonButtons As Integer, _ ByVal Icon As Integer, _ ByRef PushedButton As Integer) As Integer #End Region
''' <summary> ''' Zeigt eine Messagebox im Vista, Windows7 Stil an. ''' </summary> ''' <param name="Owner">Handle</param> ''' <param name="WindowsTitle">Überschrift im Formular</param> ''' <param name="Instruction">Anweisung</param> ''' <param name="Content">Inhaltsangabe</param> ''' <param name="Buttons">Anzuzeigende Buttons</param> ''' <param name="Icon">Auswahl des Icon</param> ''' <returns></returns> Public Function Show(ByVal Owner As IWin32Window, _ ByVal WindowsTitle As String, _ ByVal Instruction As String, _ ByVal Content As String, _ ByVal Buttons As MessageWindowButton, _ ByVal Icon As MessageWindowIcon) As MessageWindowResult Dim d As MessageWindowData d.Buttons = Buttons d.Icon = Icon d.Instruction = Instruction d.MessageContent = Content d.WindowTitle = WindowsTitle Return Me.Show(Owner, d) End Function
''' <summary> ''' Zeigt eine Messagebox im Vista, Windows7 Stil an. ''' </summary> ''' <param name="Owner">Handle</param> ''' <param name="Data">MessageWindowData Objekt</param> ''' <returns></returns> Public Function Show(ByVal Owner As IWin32Window, _ ByVal Data As MessageWindowData) As MessageWindowResult Dim a As Integer TaskDialog(Owner.Handle, IntPtr.Zero, Data.WindowTitle, _ Data.Instruction, Data.MessageContent, Data.Buttons, _ Data.Icon, a) ' Gedrückten Button bekannt geben Return GetResult(a) End Function
''' <summary> ''' Ruft ab, welcher Button gewählt wurde. ''' </summary> ''' <param name="a">Integer Wert</param> ''' <returns>MessageWindowResult</returns> Private Function GetResult(ByVal a As Integer) As MessageWindowResult Select Case a Case 1 Return MessageWindowResult.OK Exit Select Case 2 Return MessageWindowResult.Cancel Exit Select Case 4 Return MessageWindowResult.Retry Exit Select Case 6 Return MessageWindowResult.Yes Exit Select Case 7 Return MessageWindowResult.No Exit Select Case 8 Return MessageWindowResult.Close Case Else Return MessageWindowResult.None End Select End Function
End Class