witam,
znalazłem działający kod w internecie wiec załączam dla innych na przyszłość
Lista rozwijana TComboBox składa się z pojedynczych elementów (item-ów). Domyślnie dla wszystkich elementów ustawiono białe tło oraz czcionkę w kolorze czarnym. Jeźeli chcemy zmienić kolor wybranego elementu listy naleźy wykonać następujące kroki:
zmień właściwość Style z csDropDown na csOwnerDrawVariable,
zdarzenie OnDrawItem
Właściwość Style
Właściwość ta pozwala na określenie jak lista będzie wyglądać. Dla komponentu TComboBox moźna wyróźnić takie oto style:
csDropDown - edytowalna lista rozwijana,
csSimple - uproszczona, edytowalna lista, w której można wybrać wartość za pomocą kursorów,
csDropDownList - zwykła lista rozwijana,
csOwnerDrawFixed - styl wykorzystywany przy zdarzeniu OnDrawItem przy wstawianiu grafiki do listy,
csOwnerDrawVariable - styl wykorzystywany przy zdarzeniu OnDrawItem przy zmianie domyślnych ustawień czcionki i tła.
Zdarzenie OnDrawItem
W zdarzeniu OnDrawItem należy sprawdzić stan pojedynczego elementu a następnie ustawić kolor tła w taki sposób:
// jeżeli element jest zaznaczony
if(State.Contains(odSelected))
{
ComboBox->Canvas->Brush->Color = StringToColor("clNavy");
ComboBox->Canvas->TextRect(Rect,Rect.Left + 5,Rect.Top,ComboBox->Items->Strings[Index]);
}
// jeżeli to są pozostałe stany
else
{
// jeżeli jest to element o parzystym indeksie lub jak w moim przypadku if(Index==0) itd.
if(Index % 2 == 0)
{
ComboBox->Canvas->Brush->Color = StringToColor("0x00C1F0EF");
ComboBox->Canvas->TextRect(Rect,Rect.Left + 5,Rect.Top,ComboBox->Items->Strings[Index]);
}
else
{
ComboBox->Canvas->Brush->Color = StringToColor("clWhite");
ComboBox->Canvas->TextRect(Rect,Rect.Left+ 5,Rect.Top,ComboBox->Items->Strings[Index]);
}
}
Canvas to obszar, po którym można rysować. Jedną z metod klasy TCanvas jest TextRect(TRect &Rect, int X, int Y, const AnsiString Text). Pierwszy parametr, Rect to obszar pojedynczego elementu listy rozwijanej, (X, Y) to pozycje z lewej i górnej strony, od której rozpoczynamy rysować tekst, Text to tekst, który rysujemy.
Dodanie grafiki do listy TComboBox
Aby dodać grafikę do listy rozwijanej należy w pierwszej kolejności wybrać z palety komponentów TImageList, do którego wczytamy ikony, które chcemy wyświetlić. Po wykonaniu w/w kroku zmieniamy właściwość Style z csDropDown na csOwnerDrawFixed a następnie oprogramowujemy zdarzenie OnDrawItem.
// tworzymy obiekt graficzny
Graphics::TBitmap *Bmp = new Graphics::TBitmap();
// odczytujemy kolejny element graficzny z TImageList
ImageList->GetBitmap(Index, Bmp);
// rysujemy go
ComboBox->Canvas->Draw(Rect.Left, Rect.Top, Bmp);
// określamy szerokość obszaru dla tekstu
Rect.Left = Rect.Left + Bmp->Width + 5;
Rect.Right = ComboBox->Width;
// jeżeli element jest zaznaczony
if(State.Contains(odSelected))
{
ComboBox->Canvas->Brush->Color = StringToColor("clNavy");
}
// jeżeli to są pozostałe stany
else
{
// jeżeli jest to element o parzystym indeksie
if(Index % 2 == 0)
{
ComboBox->Canvas->Brush->Color = StringToColor("0x00C1F0EF");
}
else
{
ComboBox->Canvas->Brush->Color = StringToColor("clWhite");
}
}
// rysujemy prostokąt dla określonego stylu i koloru
ComboBox->Canvas->FillRect(Rect);
// rysujemy tekst
ComboBox->Canvas->TextOutA(Rect.Left, Rect.Top,ComboBox->Items->Strings[Index]);
// usuwamy obiekt graficzny
delete Bmp;