3 votes

Comment créer des boutons de liens de commande (avec plusieurs lignes de texte) en VB.NET ?

Je sais comment utiliser l'élément boutons par défaut, mais existe-t-il un moyen d'obtenir le style de boutons multilignes (ou plutôt de "texte cliquable" ?) comme indiqué ci-dessous ?

La situation est la suivante : j'ai une interface permettant à l'utilisateur de sélectionner le type de fichier qu'il souhaite établir, et une brève description doit figurer sous la grande ligne de texte principal.

Je ne prévois de l'exécuter que sous Windows 7, de sorte que je n'ai pas à me soucier de la rétrocompatibilité avec les anciennes versions de Windows.

4voto

Cody Gray Points 102261

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 :

  1. 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.

  2. 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.

  3. 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

0voto

Malheureusement, la réponse acceptée a des bogues, utilisez ma bibliothèque à la place, c'est VistaUIFramework il contient un meilleur CommandLink.

Comparaison


Réponse acceptée

  • Vous devez toujours vérifier CommandLink
  • CommandLinkNote ne fonctionne pas (si vous exécutez votre application pour la deuxième fois)
  • CommandLinkNote n'est pas multiligne
  • Il n'a pas de taille par défaut (CommandLink est trop petit par défaut)

VistaUIFramework

  • A un CommandLink contrôle
  • Note fonctionne toujours (la propriété est Note au lieu de CommandLinkNote )
  • Note est multiligne
  • Il a une taille par défaut (200x74).

VistaUIFramework possède également d'autres contrôles :

  • Bouton (avec FlatStyle=System pour que le bouton ait des effets sur les événements)
  • CheckBox (avec FlatStyle=System pour que la checkbox ait des effets sur les événements)
  • RadioButton (avec FlatStyle=System pour que le radiobutton ait des effets sur les événements)
  • TextBox (il a le Hint un texte gris qui remplace la valeur nulle)
  • Formulaire (il a le CloseBox cela fonctionne comme suit MaximizeBox y MinimizeBox mais cela fonctionne avec le bouton de fermeture)
  • ProgressBar (il a le State pour changer l'état/couleur de la barre de progression sans altérer les styles visuels natifs du système d'exploitation installé)

VistaUIFramework mélange WinForms avec Win32/WinAPI à partir de C++.

https://www.github.com/myapkapp/VistaUIFramework/

IMPORTANT : Ce n'est pas du spam, je prétends seulement poster une réponse qui offre une meilleure CommandLink et plus de choses aussi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X