W
Betrifft: FAQ-Eintrag (ListBox - farbige Einträge)
Der Code dort ist nicht schön. Vor allem an einer Stelle undefiniert, denn LBColors[3-Index] existiert nicht für Index == 0. Der Code
// Hintergrund zeichnen
ListBox1->Canvas->FillRect(Rect);
ist zudem überflüssig, da das Rechteck eh mit der in ListBox1->Canvas->Brush->Color angegebenen Farbe gefüllt wird. Mein Verbessrungsvorschlag wäre
TColor LBTextColors[3] = {clWhite, clLime, clBlack};
TColor LBBrushColors[3] = {clBlue, clBlack, clWhite};
void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control, int Index,
TRect &Rect, TOwnerDrawState State)
{
if(State.Contains(odSelected))
{
ListBox1->Canvas->Brush->Color = clYellow; // Hintergrundfarbe
ListBox1->Canvas->Font->Color = clRed; // Textfarbe
}
else
{
ListBox1->Canvas->Brush->Color = LBBrushColors[Index]; // dito
ListBox1->Canvas->Font->Color = LBTextColors[Index];
}
// Text zeichnen
ListBox1->Canvas->TextRect(Rect, Rect.Left, Rect.Top,
ListBox1->Items->Strings[Index]);
if(State.Contains(odFocused))
ListBox1->Canvas->DrawFocusRect(Rect);
}
Es ist noch zu bemerken, dass das Zeichnen des FocusRects letzteres gerade NICHT erscheinen lässt. Beim Weglassen dieses Codes wird das FocusRect gezeichnet.