TImageList i przeźroczyste ikonki

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

TImageList i przeźroczyste ikonki

Nowy postprzez MisticFrezer » Å›roda, 24 lutego 2010, 00:13

Witajcie

Mam problem z malowaniem ikonek za pomocą TImageList. Lista posiada ikonki, które chcę namalować na dowolnym tle, tak aby nie było widać tła tej ikonki [tak jak na pulpicie]. ImageType jest ustawione na itImage; DrawingStyle na dsTransparenti, kolor tła na clNone a BlendColor na clDefault.. i jest wszystko ok. :)
Przechodząc do meritum: chcę, aby ikonka była malowana jako zaznaczona (czyli pokryta np. niebieskim kolorem). Zmieniam DrawingStyle na dsFocus i
teraz ikonka rzeczywiście maluje się jako 'zaznaczona' ale za nią widać biały kwadrat. W żaden sposób nie mogę się tego pozbyć, ani stosując maski, ani nic. Zawsze coś zostaje. Ikonki są w porządku bo są wczytywane z plików .exe.

Jest na to jakaÅ› rada?
Avatar użytkownika
MisticFrezer
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): wtorek, 23 lutego 2010, 23:57
Lokalizacja: Wrocław
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 4
System operacyjny: Windows XP Pro SP3, Windows 7 Pro
Kompilator: BCB6, RAD Studio 2010, VS 2010
Gadu Gadu: 0
    Windows XPOpera

Re: TImageList i przeźroczyste ikonki

Nowy postprzez Cyfrowy Baron » Å›roda, 24 lutego 2010, 11:53

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().
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: TImageList i przeźroczyste ikonki

Nowy postprzez MisticFrezer » Å›roda, 24 lutego 2010, 13:07

Rzeczywiście nie wyraziłem się jasno. Ikony są malowane metodą TImageList::Draw na Canvasie Formularza, w zdarzeniu OnPaint. Wychodzi mi takie coś: Obrazek.
Ikonka po lewej jest 'zaznaczona', ale jej tło - czyli biały kwadrat, mnie nie satysfakcjonuje Można się tego pozbyć?.
Ikony są przygotowane dobrze, ponieważ są używane przez system.
Avatar użytkownika
MisticFrezer
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): wtorek, 23 lutego 2010, 23:57
Lokalizacja: Wrocław
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 4
System operacyjny: Windows XP Pro SP3, Windows 7 Pro
Kompilator: BCB6, RAD Studio 2010, VS 2010
Gadu Gadu: 0
    Windows XPOpera

Re: TImageList i przeźroczyste ikonki

Nowy postprzez Cyfrowy Baron » Å›roda, 24 lutego 2010, 13:08

Ikonka po lewej jest 'zaznaczona', ale jej tło - czyli biały kwadrat, mnie nie satysfakcjonuje Można się tego pozbyć?.


A w jakiż to sposób jest zaznaczona, skoro jest tylko narysowana metodą Draw na Canvas formularza?!
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: TImageList i przeźroczyste ikonki

Nowy postprzez MisticFrezer » Å›roda, 24 lutego 2010, 13:19

Dlatego napisałem zaznaczona w cudzysłowie. Maluje się tak, ponieważ zmieniam DrawingStyle z dsTransparent na dsFocus lub dsSelected, bo potrzebuję osiągnąć EFEKT ZAZNACZENIA (swoją drogą ona naprawdę jest zaznaczana myszką, kliknięcie na ikonkę powoduje ponowne odrysowanie wszystkich ikonek w oknie, a tej wybranej w innym stylu, stąd nieporozumienie).
Po prostu pytam się, czy TImageList może namalować metodą Draw na Canvasie Formularza ikonkę pokrytą kolorowym (tutaj niebieskim) filtrem bez pozostawiania białej obwódki.
Avatar użytkownika
MisticFrezer
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): wtorek, 23 lutego 2010, 23:57
Lokalizacja: Wrocław
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 4
System operacyjny: Windows XP Pro SP3, Windows 7 Pro
Kompilator: BCB6, RAD Studio 2010, VS 2010
Gadu Gadu: 0
    Windows XPOpera

Re: TImageList i przeźroczyste ikonki

Nowy postprzez Cyfrowy Baron » Å›roda, 24 lutego 2010, 14:16

Doprawdy nie wiem co robisz źle, gdyż to powinno działać.

Kod: Zaznacz cały
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
tapeta = new Graphics::TBitmap;
tapeta->LoadFromResourceName((int)HInstance, "WALLPAPER256");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
this->Canvas->Brush->Bitmap = tapeta;
this->Canvas->FillRect(this->ClientRect);
ImageList1->Draw(this->Canvas, 30, 30, 0, true);   
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
static bool invalidate = false;
if(X > 30 && X < 78 && Y > 30 && Y < 78)
{
  if(!invalidate)
  {
   ImageList1->DrawingStyle = dsSelected;
   this->Invalidate();
   invalidate = true;
   Label1->Transparent = false;
  }
}
else
{
  if(invalidate)
  {
   ImageList1->DrawingStyle = Imglist::dsNormal;
   this->Invalidate();
   invalidate = false;
   Label1->Transparent = true;
  }
}
}
//---------------------------------------------------------------------------
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 2 gości

cron