Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0085: ColorComboBox

 von 

Beschreibung

Dieser Tipp demonstriert wie man mittels Owner-Drawing das Aussehen einer Combobox (oder auch Listbox) an die eigenen Wünsche anpassen kann. Hierfür wird hier eine Combobox für Farben (System.Drawing.Color) implementiert.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Framework-Version(en):

.NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5

.NET-Version(en):

Visual Basic 2005, Visual Basic 2008

Download:

Download des Beispielprojektes [11,93 KB]

' Dieser Quellcode stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!

' Projektversion:   Visual Studio 2005
' Option Strict:    An
'
' Referenzen: 
'  - System
'  - System.Data
'  - System.Deployment
'  - System.Drawing
'  - System.Windows.Forms
'  - System.Xml
'
' Imports: 
'  - System
'  - System.Collections
'  - System.Collections.Generic
'  - System.Data
'  - System.Drawing
'  - System.Diagnostics
'  - System.Windows.Forms
'

' ##############################################################################
' ############################# ComboBoxColors.vb ##############################
' ##############################################################################
Imports System.ComponentModel

''' <summary>
''' Combobox mit den Systemfarben (KnownColors)
''' </summary>
Public Class ComboBoxColors
    Inherits ComboBox

    Private m_DefaultColor As Color = Color.Aqua

    <Description("dargestellte Farbe bei Programmstart"), _
    Category("Darstellung")> _
    Public Property DefaultColor() As Color
        Get
            Return m_DefaultColor
        End Get
        Set(ByVal value As Color)
            m_DefaultColor = value
        End Set
    End Property

    Public Sub New()
        Me.DrawMode = Windows.Forms.DrawMode.OwnerDrawFixed
        Me.DropDownStyle = ComboBoxStyle.DropDownList
    End Sub

    Private Sub LoadColors()
        ' Die KnownColors auslesen
        Dim ColorNames() As String = [Enum].GetNames(GetType(KnownColor))
        For i As Integer = 27 To ColorNames.GetUpperBound(0) - 7
            Me.Items.Add(ColorNames(i))
        Next
    End Sub

    ''' <summary>
    ''' Eintrag in Combo auswählen über die Bezeichnung der Farbe
    ''' </summary>
    ''' <param name="ColorName">Bezeichnung der Farbe</param>
    Public Sub SelectColorByName(ByVal ColorName As String)
        For i As Integer = 0 To Me.Items.Count - 1
            If ColorName.ToUpper = Me.Items(i).ToString.ToUpper Then
                Me.SelectedIndex = i
                Exit For
            End If
        Next
    End Sub

    ''' <summary>
    ''' Eintrag in Combo auswählen über die Farbe
    ''' </summary>
    ''' <param name="Color">die Farbe</param>
    Public Sub SelectColor(ByVal Color As Color)
        For i As Integer = 0 To Me.Items.Count - 1
            If Color.Name = Me.Items(i).ToString Then
                Me.SelectedIndex = i
                Exit For
            End If
        Next
    End Sub

    ''' <summary>
    ''' aktuell ausgewählte Farbe abrufen
    ''' </summary>
    Public Function SelectedColor() As Color
        Dim c As Color = Nothing
        If Me.SelectedIndex >= 0 Then
            c = Color.FromName(Me.SelectedItem.ToString)
        End If
        Return c
    End Function

    ''' <summary>
    ''' Bezeichnung der aktuell ausgewählten Farbe abrufen
    ''' </summary>
    Public Function SelectedColorName() As String
        Dim s As String = Nothing
        If Me.SelectedIndex >= 0 Then
            s = Me.SelectedItem.ToString
        End If
        Return s
    End Function

    ''' <summary>
    ''' (Erst)Aktivierung der Parentform
    ''' </summary>
    Protected Overrides Sub OnCreateControl()
        ' Die KnownColors auslesen
        If Not Me.DesignMode Then
            LoadColors()
            ' Die Defaultfarbe in der Combo auswählen
            If DefaultColor <> Nothing Then
                SelectColor(DefaultColor)
            End If
        End If

        MyBase.OnCreateControl()
    End Sub

    ''' <summary>
    ''' Ausklappen der Combo mit Anzeige der Items
    ''' </summary>
    Protected Overrides Sub OnDrawItem( _
        ByVal e As System.Windows.Forms.DrawItemEventArgs)

        If e.Index >= 0 Then
            Dim Gr As Graphics = e.Graphics
            Dim x As Single = e.Bounds.Left
            Dim y As Single = e.Bounds.Top
            Dim h As Single = e.Bounds.Height
            Dim w As Single = h

            ' Farbe über Bezeichnung laden
            Using SB As New SolidBrush( _
                Color.FromName(Me.Items(e.Index).ToString))

                ' Ein gefülltes Rechteck zeichnen
                Gr.FillRectangle(SB, x + 2, y + 1, w, h - 4)
                Gr.DrawRectangle(Pens.Black, x + 2, y + 1, w, h - 4)

                ' Selected Item Invers, Not Selected Normal
                Using BR As New SolidBrush(Me.ForeColor)
                    If CBool(e.State And DrawItemState.Selected) Then
                        SB.Color = Color.DarkBlue
                        BR.Color = Me.BackColor
                    Else
                        SB.Color = Me.BackColor
                    End If
                    Gr.FillRectangle(SB, w + 10, y, _
                        e.Bounds.Width - (w + 10), h - 1)
                    Gr.DrawString(Me.Items.Item(e.Index).ToString, _
                        Me.Font, BR, w + 10, y)
                End Using
            End Using
        End If
    End Sub
End Class

' ##############################################################################
' ################################# Form1.vb ###################################
' ##############################################################################
Public Class Form1
    Private Sub ComboBoxColors1_SelectedIndexChanged( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs) _
        Handles ComboBoxColors1.SelectedIndexChanged

        'Bezeichnung der ausgewählten Farbe
        Label1.Text = "Selected: " & ComboBoxColors1.SelectedColorName

        'ausgewählte Farbe
        ListBox1.BackColor = ComboBoxColors1.SelectedColor
    End Sub
End Class

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.