Combobox avec pastille de couleur

Description

Ne trouvant rien sur le net j'ai fait un Combobox qui affiche la liste des couleurs contenues dans la Class Color. Et comme elle ne sont pas toujours explicites, j'ai ajouter une pastille à la gauche du nom avec la couleur correspondante.

Au niveau de l'utilisation, il faut penser à appeler la méthode ComboCouleur1.GenererListeCouleur() dans la fonction Load de votre fenêtre sinon votre combo restera vide. Vous pouvez ajouter un élément manuellement, dans ce cas il faut ajouter un objet ComboBoxCouleurItem qui contient les propriétés suivantes :
- Texte (string) : le texte affiché ;
- ImageCouleur (Color) : la couleur associée ;
- AltValue (string) : texte d'information.

Pour récupérer les infos sur un item j'ai également ajouté les fonctions ItemSelectionne() pour obtenir l'item actuellement sélectionné, et InfoItem(i) pour obtenir des données d'un item en particulier. Pour au contraire sélectionner un item particulier, vous pouvez utiliser la fonction SelectionnerItem() soit en indiquant le nom de l'item soit une couleur. Pour le reste c'est comme un ComboBox classique.

J'ai mis également le dll déjà généré (version 1.1) pour ceux qui souhaite l'utiliser tel quel ou qui ne sont pas en vb.net. Il suffit alors de l'utiliser comme tout autre contrôle .net

Source / Exemple :


'**********************************************
' Exemple d'utilisation
'**********************************************

'Générer la liste des couleurs
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     ComboCouleur1.GenererListeCouleur()
end sub

'Pour ajouter un item
Dim NouvelItem as New ComboBoxCouleurItem("Nom de la couleur",Color.Black)
'Ou
Dim NouvelItem as New ComboBoxCouleurItem
NouvelItem.Texte = "Nom de la couleur"
NouvelItem.ImageCouleur = Color.Black

'Pour connaître les info de l'item sélectionné
Dim Selection as ComboBoxCouleurItem
Selection  = ComboCouleur1.ItemSelectionne()

'Pour connaître les info de d'un item en particulier
Dim Info as ComboBoxCouleurItem
Info = ComboCouleur1.InfoItem(5)

'Pour sélectionner un item
ComboCouleur1.SelectionnerItem("Red")
'Ou
Dim Couleur as New Color
Couleur.FromName("Red")
ComboCouleur1.SelectionnerItem(Couleur)

'**********************************************
' Le code source
'**********************************************
Imports System.Windows.Forms
Imports System.Drawing
Imports ComboCouleur.ComboBoxCouleurItem

Public Class ComboCouleur
    Inherits ComboBox
    ''' <summary>
    ''' Taille de la pastille de couleur. Elle défini également l'espace entre la pastille et le texte
    ''' </summary>
    Property PictureSize As Size
    ''' <summary>
    ''' Contient la liste des images de couleur.
    ''' </summary>
    ''' <remarks>
    ''' Il faut utiliser GenererListeCouleur ou ajouter manuellement les entrées pour que cette liste se génère.
    ''' </remarks>
    Public ImgList As New ImageList
    ''' <summary>
    ''' Set/Get pour la liste d'image
    ''' </summary>
    ''' <value>Une ImageList</value>
    ''' <returns>Une ImageList</returns>
    ''' <remarks></remarks>
    Public Property ImageList() As ImageList
        Get
            Return ImgList
        End Get
        Set(ByVal mImgList As ImageList)
            ImgList = mImgList
        End Set
    End Property

    ''' <summary>
    ''' Constructeur du contrôle
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New()
        Me.DrawMode = DrawMode.OwnerDrawFixed
        Me.Text = "tImageCombo"
        Me.DropDownStyle = ComboBoxStyle.DropDownList
    End Sub

    ''' <summary>
    ''' On gère le nouvelle affichage de la liste
    ''' </summary>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Protected Overrides Sub OnDrawItem(ByVal e As System.Windows.Forms.DrawItemEventArgs)
        e.DrawBackground()
        e.DrawFocusRectangle()

        Dim item As New ComboBoxCouleurItem

        Dim bounds As New Rectangle
        bounds = e.Bounds

        Try
            item = Me.Items(e.Index)
            'On ajoute l'image de la couleur
            Me.ImageList.Draw(e.Graphics, bounds.Left, bounds.Top, e.Index)
            'On ajoute le nom de la couleur
            e.Graphics.DrawString(item.Text, e.Font, New SolidBrush(e.ForeColor), bounds.Left + PictureSize.Width, bounds.Top)

        Catch ex As Exception
        End Try
        MyBase.OnDrawItem(e)
    End Sub

    ''' <summary>
    ''' Permet de généré une image bitmap
    ''' </summary>
    ''' <param name="LaCouleur">La couleur de la pastille</param>
    ''' <returns>Une image bitmap de la couleur demandée entourée d'un liseret noir</returns>
    ''' <remarks></remarks>
    Private Function CreateColor(ByVal LaCouleur As Color) As Bitmap
        Dim Image As New Bitmap(PictureSize.Width, PictureSize.Height)
        Dim i, j As Integer

        'On met tous les pixels dans la couleur indiquée
        For i = 0 To PictureSize.Width - 1
            For j = 0 To PictureSize.Height - 1
                Image.SetPixel(i, j, LaCouleur)
            Next
        Next

        'On met le tour en noir
        For i = 0 To PictureSize.Width - 1
            Image.SetPixel(i, 0, Color.Black)
            Image.SetPixel(i, PictureSize.Height - 1, Color.Black)
        Next
        For i = 0 To PictureSize.Height - 1
            Image.SetPixel(0, i, Color.Black)
            Image.SetPixel(PictureSize.Width - 1, i, Color.Black)
        Next

        'On retourne une image bitmap
        Return Image
    End Function

    ''' <summary>
    ''' Permet de générer la liste des couleur de base de la class Color
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub GenererListeCouleur()
        PictureSize = New Size(24, 16)
        Dim Image As New Bitmap(PictureSize.Width, PictureSize.Height)
        'Dim couleurs As Type = GetType(KnownColor)
        Dim NewItem As ComboBoxCouleurItem

        'obtention du Type Color suivant une couleur au hazard
        Dim oT As Type = System.Drawing.Color.Beige.GetType
        'obtention des propriétés du type dans un tableau
        Dim oProperties() As System.Reflection.PropertyInfo = oT.GetProperties

        For Each oP As System.Reflection.PropertyInfo In oProperties
            If oP.CanRead Then
                'On utilise le try pour passer à la suite quand CType échoue
                Try
                    NewItem = New ComboBoxCouleurItem
                    NewItem.Text = oP.Name
                    NewItem.ImageCouleur = CType(oP.GetValue(oT, Nothing), Color)
                    NewItem.AltValue = oP.Name
                    Me.Items.Add(NewItem)

                    ImgList.Images.Add(Me.CreateColor(NewItem.ImageCouleur))
                Catch ex As Exception
                End Try
            End If
        Next
    End Sub

    ''' <summary>
    ''' Renvoie l'item sélectionné
    ''' </summary>
    ''' <returns>Un objet contenant toutes les informations de la ligne sélectionnée</returns>
    ''' <remarks></remarks>
    Public Function ItemSelectionne() As ComboBoxCouleurItem
        Return Me.SelectedItem
    End Function

    
    ''' <summary>
    ''' Permet de sélectionner un Item à partir de son nom
    ''' </summary>
    ''' <param name="NomCouleur">La valeur contenue dans l'attribut Texte du ComboBoxCouleurItem</param>
    ''' <returns>Vrai si l'item est trouvé et sélectionné</returns>
    ''' <remarks></remarks>
    Public Function SelectionnerItem(ByVal NomCouleur As String) As Boolean
        Dim Trouve As Boolean = False
        Dim i As Long

        'On cherche l'item
        For i = 0 To Me.Items.Count - 1
            If Me.Items(i).Text = NomCouleur Then
                Trouve = True
                Exit For
            End If
        Next

        If Trouve = True Then
            'On sélectionne 
            Me.SelectedIndex = i
            Return True
        Else
            Return False
        End If

    End Function

    ''' <summary>
    ''' Permet de sélectionner un Item à partir de sa couleur
    ''' </summary>
    ''' <param name="Couleur">La couleur contenue dans l'attribut ImageCouleur du ComboBoxCouleurItem</param>
    ''' <returns>Vrai si l'item est trouvé et sélectionné</returns>
    ''' <remarks></remarks>
    Public Function SelectionnerItem(ByVal Couleur As Color) As Boolean
        Dim Trouve As Boolean = False
        Dim i As Long

        'On cherche l'item
        For i = 0 To Me.Items.Count - 1
            If Me.Items(i).ImageCouleur = Couleur Then
                Trouve = True
                Exit For
            End If
        Next

        If Trouve = True Then
            'On sélectionne 
            Me.SelectedIndex = i
            Return True
        Else
            Return False
        End If

    End Function

    ''' <summary>
    ''' Obtenir les informations sur l'item désiré
    ''' </summary>
    ''' <param name="Index">Index de l'item à récupérer</param>
    ''' <returns>Un objet contenant toutes les informations de l'item demandé</returns>
    ''' <remarks></remarks>
    Public Function InfoItem(ByVal Index As Integer) As ComboBoxCouleurItem
        Return Me.Items(Index)
    End Function
End Class

'//////////////////////////////////////////
'/////////////////////////////////////////
'////////////////////////////////////////

''' <summary>
''' Le nouvel objet pour chaque élément de la liste d'item
''' </summary>
''' <remarks></remarks>
Public Class ComboBoxCouleurItem
    ''' <summary>
    ''' Le titre de l'item
    ''' </summary>
    ''' <remarks></remarks>
    Private _text As String
    ''' <summary>
    ''' La couleur de la pastille associée
    ''' </summary>
    ''' <remarks></remarks>
    Private _ImageCouleur As Color
    ''' <summary>
    ''' Le texte d'info
    ''' </summary>
    ''' <remarks></remarks>
    Private _AltValue As String

    ''' <summary>
    ''' Get/Set pour _text
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Property Text() As String
        Get
            Return _text
        End Get
        Set(ByVal Value As String)
            _text = Value
        End Set
    End Property

    ''' <summary>
    ''' Get/Set pour _AltValue
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Property AltValue() As String
        Get
            Return _AltValue
        End Get
        Set(ByVal Value As String)
            _AltValue = Value
        End Set
    End Property

    ''' <summary>
    ''' Get/Set pour _ImageCouleur
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Property ImageCouleur() As Color
        Get
            Return _ImageCouleur
        End Get

        Set(ByVal Value As Color)
            _ImageCouleur = Value
        End Set
    End Property

    ''' <summary>
    ''' Constructeur
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New()
        _text = ""
        _ImageCouleur = Color.White
    End Sub

    ''' <summary>
    ''' Constructeur
    ''' </summary>
    ''' <param name="text">Le titre de l'item</param>
    ''' <remarks></remarks>
    Public Sub New(ByVal text As String)
        _text = text
    End Sub

    ''' <summary>
    ''' Constructeur
    ''' </summary>
    ''' <param name="text">Le titre de l'item</param>
    ''' <param name="ImageCouleur">La couleur associée à l'item</param>
    ''' <param name="AltValue">Le texte d'information</param>
    ''' <remarks></remarks>
    Public Sub New(ByVal text As String, ByVal ImageCouleur As Color, Optional ByVal AltValue As String = "")
        _text = text
        _ImageCouleur = ImageCouleur
        _AltValue = AltValue
    End Sub

    ''' <summary>
    ''' Conversion en String
    ''' </summary>
    ''' <returns>Le titre de l'item</returns>
    ''' <remarks></remarks>
    Public Overrides Function ToString() As String
        Return _text
    End Function
End Class

Conclusion :


Si vous avez des questions, ou des conseils pour amélioré ce contrôle n'hésitez pas.
Merci

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.