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 18.519 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
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. |
sevISDN 1.0 Überwachung aller eingehender Anrufe! Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Tipp des Monats April 2024 Skyfloy Chart von Microsoft und dazu noch gratis Tutorial für Microsoft Chart Controls für Microsoft .NET Framework 3.5 sevGraph (VB/VBA) Grafische Auswertungen Präsentieren Sie Ihre Daten mit wenig Aufwand in grafischer Form. sevGraph unterstützt hierbei Balken-, Linien- und Stapel-Diagramme (Stacked Bars), sowie 2D- und 3D-Tortendiagramme und arbeitet vollständig datenbankunabhängig! |
||||||||||||||||
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. |