Le bouton illustré dans la capture d'écran est en fait un bouton utilisé dans l'ensemble de l'interface utilisateur d'Aero. Il s'agit d'un style de bouton personnalisé appelé "lien de commande", qui peut être facilement appliqué à un bouton standard de l'interface utilisateur d'Aero. Button
contrôle.
Malheureusement, les bibliothèques WinForms n'exposent pas cette fonctionnalité via une simple propriété, mais cela peut être facilement corrigé avec un peu de P/Invoke.
Le style que vous recherchez s'appelle BS_COMMANDLINK
. Selon la documentation ce style :
Crée un bouton de lien de commande qui se comporte comme une BS_PUSHBUTTON
mais le bouton de lien de commande comporte une flèche verte à gauche pointant vers le texte du bouton. Une légende pour le texte du bouton peut être définie en envoyant la commande BCM_SETNOTE
sur le bouton.
Voici une petite classe de contrôle de bouton personnalisée qui étend la classe standard de WinForms Button
et met en œuvre le style "lien de commande" comme une propriété que vous pouvez configurer dans le concepteur ou dans le code.
Deux choses à noter à propos du code :
-
Le site FlatStyle
doit toujours être définie comme FlatStyle.System
qui force l'utilisation du contrôle de bouton standard de l'API Windows, plutôt qu'un contrôle dessiné par le code WinForms. Ceci est nécessaire pour le BS_COMMANDLINK
pour fonctionner (parce qu'il n'est supporté que par les contrôles natifs), et il produit un contrôle de bouton de meilleure qualité (avec des effets de pulsation, etc.) de toute façon. Pour forcer cela, j'ai surchargé la fonction FlatStyle
et définir une valeur par défaut.
-
Le site CommandLink
permet d'activer et de désactiver le style "lien de commande". Elle est désactivée par défaut, ce qui vous donne un bouton de contrôle standard, vous pouvez donc remplacer la propriété tous des contrôles de boutons de votre application avec celui-ci, si vous le souhaitez, juste par commodité. Lorsque vous activez cette propriété (en lui attribuant la valeur True
), vous obtenez alors un bouton de lien de commande fantaisiste et multiligne.
-
La légende du bouton de lien de commande est la même que celle qui est affichée sur un bouton standard. Toutefois, la légende du bouton également supporte une "description" sur la deuxième ligne. Ceci est configurable par une autre propriété, appelée CommandLinkNote
après le message WinAPI, BCM_SETNOTE
. Lorsque le bouton est configuré comme un bouton de commande standard ( CommandLink = False
), la valeur de cette propriété est ignorée.
Imports System.Windows.Forms
Imports System.ComponentModel
Imports System.Runtime.InteropServices
Public Class ButtonEx : Inherits Button
Private _commandLink As Boolean
Private _commandLinkNote As String
Public Sub New() : MyBase.New()
'Set default property values on the base class to avoid the Obsolete warning
MyBase.FlatStyle = FlatStyle.System
End Sub
<Category("Appearance")> _
<DefaultValue(False)> _
<Description("Specifies this button should use the command link style. " & _
"(Only applies under Windows Vista and later.)")> _
Public Property CommandLink As Boolean
Get
Return _commandLink
End Get
Set(ByVal value As Boolean)
If _commandLink <> value Then
_commandLink = value
Me.UpdateCommandLink()
End If
End Set
End Property
<Category("Appearance")> _
<DefaultValue("")> _
<Description("Sets the description text for a command link button. " & _
"(Only applies under Windows Vista and later.)")> _
Public Property CommandLinkNote As String
Get
Return _commandLinkNote
End Get
Set(value As String)
If _commandLinkNote <> value Then
_commandLinkNote = value
Me.UpdateCommandLink()
End If
End Set
End Property
<Browsable(False)> <EditorBrowsable(EditorBrowsableState.Never)> _
<DebuggerBrowsable(DebuggerBrowsableState.Never)> _
<Obsolete("This property is not supported on the ButtonEx control.")> _
<DefaultValue(GetType(FlatStyle), "System")> _
Public Shadows Property FlatStyle As FlatStyle
'Set the default flat style to "System", and hide this property because
'none of the custom properties will work without it set to "System"
Get
Return MyBase.FlatStyle
End Get
Set(ByVal value As FlatStyle)
MyBase.FlatStyle = value
End Set
End Property
Region "P/Invoke Stuff"
Private Const BS_COMMANDLINK As Integer = &HE
Private Const BCM_SETNOTE As Integer = &H1609
<DllImport("user32.dll", CharSet:=CharSet.Unicode, SetLastError:=False)> _
Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As IntPtr, _
<MarshalAs(UnmanagedType.LPWStr)> ByVal lParam As String) As IntPtr
End Function
Private Sub UpdateCommandLink()
Me.RecreateHandle()
SendMessage(Me.Handle, BCM_SETNOTE, IntPtr.Zero, _commandLinkNote)
End Sub
Protected Overrides ReadOnly Property CreateParams As CreateParams
Get
Dim cp As CreateParams = MyBase.CreateParams
If Me.CommandLink Then
cp.Style = cp.Style Or BS_COMMANDLINK
End If
Return cp
End Get
End Property
End Region
End Class