vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Oberfläche · MessageBox   |   VB-Versionen: VB2005, VB200829.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 KonschakBewertung:  Views:  14.098 
ohne HomepageSystem:  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



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.