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