C++ Builder Snippets  


TComboBox für die Farbauswahl verwenden:
 
Die Meisten kennen die BCB-Komponente TColorDialog, die das Windows-Dialogfeld für die Farbauswahl kapselt. Je nach Anwendung kann TColorDialog allerdings auch mal etwas zu überladen oder umständlich zu handhaben sein. Soll der Benutzer nur die Möglichkeit bekommen, zwischen bestimmten Farben zu wählen (wie z.B. die Schriftfarbenauswahl im TFontDialog) kann dies mit Hilfe einer gewöhnlichen TComboBox erfolgen.

In unserem Beispiel wird eine TComboBox namens ComboBox1 auf dem Formular platziert und ihre Eigenschaft Style auf csOwnerDrawFixed gesetzt. Somit müssen wir uns auch um das Zeichnen der "Einträge" selbst kümmern.
Zunächst deklarieren wir ein (globales) Array für TColor-Werte und füllen es mit anzuzeigenden Farben:
// Array mit Farbwerten deklarieren
// und initialisieren:
TColor ComboColors[] = {
    clBlack,  clMaroon,  clGreen, clOlive,
    clNavy,   clPurple,  clTeal,  clGray,
    clSilver, clRed,     clLime,  clYellow,
    clBlue,   clFuchsia, clAqua,  clWhite   };
Damit die ComboBox für jede der 16 Farben einen Eintrag erzeugt, füllen wir sie z.B. im OnShow-Eventhandler des Formulars mit 16 leeren Items:
//---------------------------------------------------------------------------
// OnShow-Eventhandler des Formulars
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormShow(TObject *Sender)
{
  // ComboBox mit 16 leeren Einträgen füllen
  for(int ilIndex = 0; ilIndex < 16; ilIndex++)
    ComboBox1->Items->Add("");
  // ComboBox1->ItemIndex = 0;
  // ComboBox1Click(NULL);
}
Nun muss eine eigene Routine dafür sorgen, dass die ComboBox-Einträge als farbige Rechtecke erscheinen. Diese wird in der Behandlungsroutine des OnDrawItem-Ereignisses der ComboBox untergebracht:
//---------------------------------------------------------------------------
// OnDrawItem-Eventhandler der ComboBox
//---------------------------------------------------------------------------
void __fastcall TfrmMain::ComboBox1DrawItem(TWinControl *Control,
      int Index, TRect &Rect, TOwnerDrawState State)
{
  // Sender-Zeiger casten:
  TComboBox* pComboBox = dynamic_cast<TComboBox*>(Control);
  if(pComboBox)
  {
    TRect rPaintRect;
    rPaintRect.Top = Rect.Top+2;
    rPaintRect.Bottom = Rect.Bottom-2;
    rPaintRect.Left = Rect.Left+2;
    rPaintRect.Right = Rect.Right-2;

    // Markierungsrechteck füllen:
    pComboBox -> Canvas -> FillRect(Rect);

    // Umriss der Farb-Rechtecke zeichnen:
    pComboBox -> Canvas -> Pen ->Color = clWindowText;
    pComboBox -> Canvas -> Rectangle(rPaintRect.Left, rPaintRect.Top,
      rPaintRect.Right, rPaintRect.Bottom);

    // Farbiges Rechteck ausgeben:
    pComboBox -> Canvas -> Brush ->Color = ComboColors[Index];
    InflateRect(&rPaintRect, -1, -1);
    pComboBox -> Canvas -> FillRect(rPaintRect);
  }
}
Die in der ComboBox ausgewählte Farbe kann nun mit Hilfe der Anweisung ComboColors[ComboBox1->ItemIndex] ausgelesen werden:
//---------------------------------------------------------------------------
// OnClick-Eventhandler der ComboBox
//---------------------------------------------------------------------------
void __fastcall TfrmMain::ComboBox1Click(TObject *Sender)
{
  // Dem Shape neue Farbe zuweisen:
  if(ComboBox1->ItemIndex >= 0)
    Shape1->Brush->Color = ComboColors[ComboBox1->ItemIndex];
}
//---------------------------------------------------------------------------

  Download BCB5
Projekt-Quellcode
Download
Demo-Exe

© '99-2002 by S. Kreutzmann