Nie jest to skomplikowane.
Nie podałeś jak to robisz, ani na czym rysujesz te ikony, więc mogę się tylko domyślać, że chodzi o
TImage i rysowanie ikonek na grafice wczytanej do Image. Przede wszystkim by wszystko prawidłowo współpracowało Image powinno zawierać grafikę w formacie
BMP, a nie
JPEG, czy
PNG.
ImageList może zawierać zarówno pliki w formacie
ICO jak i bitmapy
BMP. Bitmapy muszą być odpowiednio przygotowane, czyli muszą mieć jednolite tło, które po wczytaniu takiej bitmapy do
ImageList zostanie z niej usunięte. Przy usuwaniu tła z bitmapy
ImageList sprawdza kolor piksela
w lewym dolnym rogu bitmapy i ten kolor usuwa. Przy wczytywaniu bitmapy do
Imagelist można oczywiście samodzielnie wybrać kolor do usunięcia zakraplaczem.
Ustawienia właściwości
ImageList1:
BkColor = clNBone; BlendColor = clNone; DrawingStyle = dsNormal; ImageType = itImage; Height = wysokość wczytanych ikon np. 48 Width = długość wczytanych ikon np. 48 |
Jeżeli kod odrysowujący ikonę na bitmapie w
Image1 umieszczamy w zdarzeniu
OnPaint, to
TImage nie ma takiego zdarzenia, więc trzeba skorzystać ze zdarzenia
OnPaint formularza:
- Kod: Zaznacz cały
void __fastcall TForm1::FormPaint(TObject *Sender)
{
ImageList1->Draw(Image1->Canvas, 20, 20, 0, true);
}
Jeżeli chcemy odrysować tylko raz np. w zdarzeniu
OnClick przycisku
Button1 to należy wywołać funkcję
Invalidate() celem odświeżenia zawartości
TImage:
- Kod: Zaznacz cały
void __fastcall TForm1::Button2Click(TObject *Sender)
{
ImageList1->Draw(Image1->Canvas, 20, 20, 0, true);
Image1->Invalidate();
}
Draw(TCanvas *Canvas, int X, int Y, Index ikony, true); |
Klasa
TImage ma to do siebie, iż nie wymaga zdarzenia
OnPaint do nieustannego odrysowywania własnej zawartości, jeżeli jednak rysujemy na powierzchniach innych kontrolek to należy to robić właśnie w zdarzeniu
OnPaint. W przeciwnym razie po każdym odświeżeniu takiej kontrolki jej zawartość zniknie. W zdarzeniu
OnPaint nie stosujemy funkcji
Imvalidate().