Jak wstawić w BCB5 obrazek do ComboBox'a np. aby był obrazek a po nim (okok) jakiś tekst. Czy w ogóle jest możliwe wyświetlenie obrazka i tekstu razem, bo samego obrazka nie ma problemu.
A więc tak... ComboBox`a ustaw:
ComboBox1->Style = csOwnerDrawFixed;
Wstaw na formę komponent TImageList i załaduj do niego ikonki...
Teraz zagospodarujmy sobie zdarzenie OnDrawItem (w ComboBox1), np tak:
void __fastcall TForm1::ComboBox1DrawItem(TWinControl *Control, int Index,
TRect &Rect, TOwnerDrawState State)
{
TImageList *Lista;
TCanvas *Cnv;
Lista = ImageList1; //lista ikonek
Cnv = ComboBox1->Canvas; //Canva na której rysujemy
unsigned char offsetX=10; //odstęp poziomy między krawędzią a obrazkiem w pixelach
unsigned char offsetY=2;//odstęp pionowy, reszta j/w
unsigned char space = 3; //ostęp między obrazkiem a textem
int Xs=Rect.Left+offsetX, Ys=Rect.Top+offsetY;
bool enable = !State.Contains(odDisabled);//czy ten item jest aktywny?
AnsiString Text=ComboBox1->Items->Strings[Index];
//jest możliwe, że dany item ma by podswietlony...
Cnv->Brush->Color = (State.Contains(odSelected))?(clNavy):(clWhite);
//i zarysowujem itema !! ;p
Cnv->FillRect(Rect);
//no to sobie rysujemy obrazek:)
Lista->Draw(Cnv,Xs,Ys,Index,enable);
//i text
Cnv->TextOutA(Xs+Lista->Width+space,Rect.Top+(Rect.Height()/2)-(Cnv->TextHeight(Text)/2),Text);
}
PS> "Trochę" mnie poniosło... można by to zrobić w hmmm... 4-5 linijkach kodu:) ale może tak będzie ci łatwiej zrozumieć;)
Witam,
Krecik poco się męczyć!!:D
Wsytarczy to:
void __fastcall TForm1::ComboBox1DrawItem(TWinControl *Control, int Index, TRect &Rect, TOwnerDrawState State)
{
Graphics::TBitmap *Bmp = new Graphics::TBitmap();
ImageList1->GetBitmap(Index, Bmp);
ComboBox1->Canvas->Draw(Rect.Left, Rect.Top, Bmp);
delete Bmp;
}
i jeszcze jedno musisz sobie dać komponent IMAGE LIST!!
mcbury: a oglądałeś wynik działania obu kodów? :>
Nie? To najpierw obejrzyj...
<font color="blue">[</span><font color="red">ADD</span><font color="blue">]</span>
mcbury: To sprawdź teraz oba kody i porównaj... [glowa]
ehh...
Jaki ze mnie niezdara:D
oto całkowity opis ze strony http://www.burknot.kgb.pl
Aby na poszczególnych pozycjach ComboBox1 dawać obrazki umieszczone w ImageList1 należy najpierw w Inspektorze Obiektów ustawić jego właściwość Style na csOwnerDrawFixed, a następnie utworzyć dla niego zdarzenie OnDrawItem:
void __fastcall TForm1::ComboBox1DrawItem(TWinControl *Control, int Index, TRect &Rect, TOwnerDrawState State)
{
Graphics::TBitmap *Bmp = new Graphics::TBitmap();
ImageList1->GetBitmap(Index, Bmp);
ComboBox1->Canvas->Draw(Rect.Left, Rect.Top, Bmp);
delete Bmp;
}