VB.NET-Tipp 0085: ColorComboBox
von pks
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: | 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: |
' 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.