vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevAniGif - als kostenlose Vollversion auf unserer vb@rchiv CD Vol.5  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Controls · ComboBox   |   VB-Versionen: VB5, VB610.01.02
ColorComboBox - Farbauswahl

Ein häufig vermisstes Control: Eine ComboBox als ColorPicker. Wir zeigen wie sich eine solche Farbauswahl-Box realisieren lässt.

Autor:   Dieter OtterBewertung:     [ Jetzt bewerten ]Views:  28.464 
www.tools4vb.deSystem:  Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

Annahme: Sie haben einen RTF-Editor programmiert - mit allem, was dazu gehört, also auch Schriftart-Wechsel, verschiedene Schriftgrößen und Attribute, sowie Unterstützung verschiedener Schriftfarben.

Und schon sind wir beim Thema: Auswahl der Schriftfarbe

Wenn Sie nicht gerade auf Tools von Drittherstellern oder Freeware-Komponenten zurückgreifen möchten, dann werden Sie wohl zur Auswahl der Schriftfarbe das Common Dialog Controls von Microsoft verwenden. Per Menübefehl aktivieren Sie also den Standard-Dialog "Farbe auswählen":

Private Sub mnuColor_Click()
  On Local Error Resume Next
  With CommonDialog1
    .ShowColor
    If Err = 0 Then
      RTFText.SelColor = .Color
    End If
  End With
End Sub

Klar - kann man so machen. Ein Vorteil ist auf jeden Fall, dass sich über den Standard-Dialog eine x-beliebige Farbe auswählen lässt.

Jetzt würden Sie aber gerne die häufigsten oder wichtigsten Grundfarben zur direkten Auswahl in einer aufklappbaren ListBox anbieten, so wie es viele andere Anwendungen ja auch vorsehen. Aber wie? Die Standard-ComboBox eignet sich hierfür nicht, da man hier ja nur Text anzeigen kann. Sie möchten aber anstelle von Text viele kleine unterschiedliche Farben (Rechtecke) anzeigen. Was nun?

Na ja, dann verzichten Sie halt doch auf die ColorComboBox. Oder? Halt! Da gibt es doch noch ein anderes ComboBox-Control - und zwar die ImageComboBox. Genau!. Mit der ImageComboBox lässt sich ja vor jedem Eintrag ein zusätzliches Bildsymbol darstellen. Das ist es! Wir verzichten auf den Text und zeigen nur das Bildsymbol an - dann hätten wir doch die gewünschte ColorComboBox.

Also, ran an's Werk!
Wir brauchen: 1 x ImageComboBox, 1 x ImageList-Control und 1 x PictureBox

Das ImageCombo- und ImageList-Control sind Bestandteile der Windows Common Controls. Demnach müssen wir die MSCOMCTL.OCX-Komponente über das "Projekt - Komponenten" unserem Projekt hinzufügen.

Die PictureBox verwenden wir, um die einzelnen Farb-Quadrate zu erstellen und das so erstellte Bild der ImageList (dem Abbildungs-Steuerelement) als neues Bild hinzuzufügen.

Fügen Sie nun die drei Controls auf Ihre Form und benennen Sie sie folgendermassen:
ImageCombo - imgColorCombo
ImageList - ImageList1
PictureBox - picColor

Und hier endlich der Code

Private Sub Form_Load()
  ' Farben initialisieren
  InitColors
  InitColorCombo
End Sub
Private Sub InitColors()
  ' Farb-Auswahl erstellen
  Dim I As Long
  ReDim lColor(15) As Long
 
  lColor(0) = &HFFFFFF   ' Weiss
  lColor(1) = &HE0E0E0   ' Hellgrau
  lColor(2) = &H808080   ' Grau
  lColor(3) = &H0&       ' Schwarz
  lColor(4) = &HFF0000   ' Blau
  lColor(5) = &HFFFF00   ' Zyan (Türkis)
  lColor(6) = &HFF00&    ' Grün
  lColor(7) = &HFF00FF   ' Magenta
  lColor(8) = &HFF&      ' Rot
  lColor(9) = &HFFFF&    ' Gelb
  lColor(10) = &H800000  ' Dunkelblau
  lColor(11) = &H808000  ' Blaugrün
  lColor(12) = &H8000&   ' Dunkelgrün
  lColor(13) = &H800080  ' Violett
  lColor(14) = &H80&     ' Dunkelrot
  lColor(15) = &H8080&   ' Ocker
 
  ' PictureBox unsichtbar machen
  picColor.Visible = False
 
  For I = 0 To UBound(lColor)
    With picColor
      ' PictureBox mit der Farbe füllen
      .AutoRedraw = True
      .Cls
      picColor.Line (0, 0)-(.ScaleWidth, .ScaleHeight), lColor(I), BF
 
      ' Jetzt noch einen Rahmen aussenrum
      picColor.Line (0, 0)-(.ScaleWidth, .ScaleHeight), vbBlack, B
 
      ' und ab in die ImageList ;-)
      .Picture = .Image
      .AutoRedraw = False
 
      ImageList1.ListImages.Add , "H" & Hex$(lColor(I)), _
        .Picture
    End With
  Next I
End Sub
Private Sub InitColorCombo()
  ' ImageCombo mit den Farben füllen
  Dim I As Long
 
  ' zunächst alle Einträge löschen
  imgColorCombo.ComboItems.Clear
 
  ' jetzt die Abbildungsliste zuweisen
  imgColorCombo.ImageList = ImageList1
 
  ' und zu guter Letzt die Einträge erstellen
  For I = 1 To ImageList1.ListImages.Count
    With ImageList1.ListImages(I)
      imgColorCombo.ComboItems.Add , .Key, "", I, I
    End With
  Next I
End Sub

Wird nun eine Farbe über unsere neue ColorComboBox ausgewählt, so erfolgt die Farbzuweisung über die Key-Eigenschaft. In dieser haben wir nämlich den Farbwert gespeichert - als Hexadezimalwert. Die Umrechnung von hexadezimal nach dezimal übernimmt die CLng()-Funktion.

Private Sub ImageCombo1_Click()
  ' Farbewert ermitteln
  Dim lngColor As Long
 
  With imgColorCombo.SelectedItem
    lngColor = CLng("&" & .Key)
    RTFText.SelColor = lngColor    
  End With
End Sub