vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2019
 
zurück
Rubrik: Controls   |   VB-Versionen: VB.NET11.10.04
Ein Farbauswahlcontrol mit VB.NET erstellen

Dieser Tip zeigt Ihnen wie man in VB.NET aus einer normalen Combobox eine Farbauswahl-ComboBox (ColorPicker) erstellt.

Autor:   Stefan MährBewertung:     [ Jetzt bewerten ]Views:  16.878 
www.visualsoft-net.deSystem:  Win9x, WinNT, Win2k, WinXP, Vista, Win7, Win8, Win10 Beispielprojekt auf CD 

Dieser Tip zeigt Ihnen wie man in VB.NET aus einer normalen Combobox eine Farbauswahl-ComboBox (ColorPicker) erstellt.

Öffnen Sie VS.NET, wählen als neues Projekt eine Windows-Steuerelementbibliothekund nennen Sie dies ColorPicker.

Legen Sie eine Combobox auf das Usercontrol und nennen Sie diese cmbColor. Setzen Sie die Eigenschaft DropDownStyle auf den Wert DropDownListe und DrawMode auf OWNERDRAW FIXED. Das ist sehr wichtig, da wir den Comboboxinhalt selber zeichen!

Wechseln Sie in die Codeansicht.

Zuerst die Imports Anweisungen:

Imports System
Imports System.ComponentModel

Danach deklarieren wir die benötigten Variablen:

Public Class UserControl1
  Inherits System.Windows.Forms.UserControl
  ...
 
  Private mSelectedColor As Color
  Private mCTRL As Control
  Private strColor() As String

Beim späteren Auswählen eines Farbwertes aus unserer neuen ColorComboBox wird das ColorChanged-Ereignis ausgelöst:

Public Event ColorChanged(ByVal col As Color)
' --> Das Description Attribut legt fest welcher Text im Infoteil
' --> des Property Grid gezeigt wird wenn die Eigenschaft ausgewählt wird
<Description("Gibt die ausgewählte Farbe zurück")> _
Public ReadOnly Property SelectedColor() As Color
  Get
    Return mSelectedColor
  End Get
End Property
 
<Description("Bindet ein Buddy Conrol an die ColorCombo")> _
Public Property BuddyCTRL() As Control
  Get
    Return mCTRL
  End Get
  Set(ByVal Value As Control)
    mCTRL = Value
  End Set
End Property

Die KnownColor-Routine liest alle Farben aus der KnownColor Enum des .NET Frameworks aus und fügt Sie der Combo Itemsauflistung hinzu:

Private Sub GetKnownColor()
  Dim kc As New KnownColor
  strColor = System.Enum.GetNames(kc.GetType())
 
  For i As Integer = 0 To strColor.GetUpperBound(0)
    Me.cmbColor.Items.Add(strColor(i))
  Next
End Sub

Die ColorItem-Routine zeichnet ein Rechteck mit der ausgewählten Farbe vor den Texteintrag der Combobox:

Private Sub ColorItem(ByVal ItemGraphics As Graphics, _
  ByVal ItemRectangle As Rectangle, ByVal ItemIndex As Integer)
 
  ' --> Der Name des Farbeintrages
  Dim ItemText As String = strColor(ItemIndex)
 
  ' --> Die benötigten Objekte zum zeichnen
  Dim ColorBrush As New SolidBrush(System.Drawing.Color.FromName(ItemText))
  Dim Pen As New Pen(System.Drawing.Color.Black, 1)
  Dim TextBrush As New SolidBrush(System.Drawing.Color.FromKnownColor( _
    System.Drawing.KnownColor.MenuText))
 
  ' --> der Zeichenvorgang
  With ItemGraphics
    .FillRectangle(ColorBrush, ItemRectangle.Left + 2, _
      ItemRectangle.Top + 2, 20, ItemRectangle.Height - 4)
    .DrawRectangle(Pen, New Rectangle(ItemRectangle.Left + 1, _
      ItemRectangle.Top + 1, 21, ItemRectangle.Height - 3))
    .DrawString(ItemText, Me.cmbColor.Font, TextBrush, ItemRectangle.Left + 28, _
      ItemRectangle.Top + (ItemRectangle.Height - Me.cmbColor.Font.GetHeight()) / 2)
  End With
 
  ' --> GDI Objekte sind sehr speicherintensiv, deshalb entledigen wir uns dieser sofort
  TextBrush.Dispose()
  ColorBrush.Dispose()
  Pen.Dispose()
End Sub

Im DrawItem-Event der Combobox rufen wir die Zeichenroutine auf:

Private Sub cmbColor_DrawItem(ByVal sender As Object, _
  ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles cmbColor.DrawItem
 
  If e.Index <> -1 Then Call ColorItem(e.Graphics, e.Bounds, e.Index)
End Sub

Und zu guter Letzt unser ColorChanged-Event: Dieses Ereignis wird ausgelöst wenn die Combo ein SelectedindexChanged-Event auslöst:

Private Sub cmbColor_SelectedIndexChanged(ByVal sender As Object, _
  ByVal e As System.EventArgs) Handles cmbColor.SelectedIndexChanged
 
  mSelectedColor = Color.FromName(Me.cmbColor.SelectedItem)
  If Not mCTRL Is Nothing Then mCTRL.BackColor = mSelectedColor
  RaiseEvent ColorChanged(mSelectedColor)
End Sub

Was fehlt jetzt noch? Ach ja genau: Beim Initialisieren des UserControls muss die ComboBox mit den Farbwerten gefüllt werden:

Private Sub UserControl1_Load(ByVal sender As System.Object, _
  ByVal e As System.EventArgs) Handles MyBase.Load
 
  GetKnownColor()
End Sub

Weiterhin sollte die ComboBox beim Resizen des UserControls an die Größe des UserControls angepasst werden:

Private Sub UserControl1_Resize(ByVal sender As Object, _
  ByVal e As System.EventArgs) Handles MyBase.Resize
 
  With cmbColor
    .Left = 0
    .Top = 0
    .Height = Me.Height
    .Width = Me.Width
  End With
End Sub

Kompilieren Sie das Control und fügen Sie es in einem neuen Windows-Forms-Projekt über die Toolbox ein ((Rechtsklick auf die Toolbox - "Element hinzufügen/entfernen" - im NET-Register auf "Druchsuche" klicken und nach der ColorPicker.dll suchen).

Voila, ein neues .NET-Control
 

Dieser Tipp wurde bereits 16.878 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2019 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel