Obrazek i tekst w ComboBox

0

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.

0

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ć;)

0

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!!

0

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]

0

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;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1