CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - ListView i ImageList

ListView i ImageList

dział ogólny

ListView i ImageList

Nowy postprzez kwaro » poniedziałek, 2 sierpnia 2010, 11:53

Witam
Mam problem z ikonami w ListView, wczytuję sobie ikonki (.ico) do ImageList, ImageList jest przypisany do ListView wszystko działa tylko że ikonki w ListView nie wyglądają zbyt ładnie, ponieważ posiadają taką czarną obwódkę. W google znalazłem tylko że to może chodzić o głębię kolorów ale nie wiem jak ją zmienić i gdzie czy w ListView czy w ImageList (używam C++ Builder 2007)
Z góry dzięki za pomoc
Pozdrawiam
Avatar użytkownika
kwaro
Bladawiec
Bladawiec
 
Posty: 4
Dołączył(a): poniedziałek, 2 sierpnia 2010, 10:48
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++Builder 2007
Gadu Gadu: 0
    Windows XPFirefox

Re: ListView i ImageList

Nowy postprzez Cyfrowy Baron » poniedziałek, 2 sierpnia 2010, 14:17

Głębię kolorów zmieniasz w ImageList przed dodaniem ikon, gdyż zmiana głębi bitowej po dodaniu ikon usunie ikony z ImageList.

Nie wiem jak to jest w C++Builder 2007, ale w wersji 2009 i 2010 można we właściwości ColorDepth obiektu typu TImageList wybrać opcję cd32bit co daje doskonałą jakość wyświetlania ikon. W środowisku C++Builder 2006 jednak tego nie było więc nie wiem czy będizesz miał taka opcję. Jednak niezależnie od tego jak ustawię u siebie ColorDepth ikony są prawidłowo wyświetlane o ile są prawidłowo skonstruowane, czyli mają format RGBA czyli 32 bitową głębię kolorów z kanałem Alpha.
Istotne jest również prawidłowe ustawienie właściwości Width i Height obiektu ImageList. Ustawione wymiary powinny być równe wymiarom wczytywanych ikon, a wszystkie ikony powinny mieć ten sam wymiar. Jeżeli używasz ikon o wymiarze 32x32 to taki wymiar powinieneś ustawić w ImageList.

W załączniku masz 4 przykładowe ikony w 32-bitowej głębi kolorów z kanałem Alpha o wymiarze 32x32. Przeprowadź test w swoim programie z tymi ikonami i napisz jaki osiągnąłeś efekt.


Do tworzenia ikon polecam program Axialis IconWorkshop.
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

Re: ListView i ImageList

Nowy postprzez kwaro » poniedziałek, 2 sierpnia 2010, 15:49

Niestety Builder 2007 niema opcji ColorDepth, w podanych ikonkach też występuje ten problem. Dokładniej chodzi o to że czarne tło które jest wokół ikonki nie jest usuwane tutaj je zaznaczyłem http://images40.fotosik.pl/317/4d4696702d46196b.jpg
W swoim programie ListView I ImageList tworzę dynamicznie czy to może być przyczyną problemu? Może zapominam uzupełnić jakąś właściwość?
Ikonki do ImageList wczytuję w ten sposób:
KOD cpp:     UKRYJ  
TIcon *ikonka=new TIcon();
 ikonka->LoadFromFile("jakis adres");
ImageList->AddIcon(ikonka);
 
Avatar użytkownika
kwaro
Bladawiec
Bladawiec
 
Posty: 4
Dołączył(a): poniedziałek, 2 sierpnia 2010, 10:48
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++Builder 2007
Gadu Gadu: 0
    Windows XPFirefox

Re: ListView i ImageList

Nowy postprzez Cyfrowy Baron » poniedziałek, 2 sierpnia 2010, 19:26

W swoim programie ListView I ImageList tworzę dynamicznie czy to może być przyczyną problemu?


U mnie wywołuje to problemy tylko gdy właściwość ColorDepth obiektu ImageList ma wartość cdDeviceDependent.

Ta czarna ramka to efekt półprzeźroczystości wymagający obsługi 32 bitowej głębi kolorów:

icon1.png


Jak widzisz krawędzie są półprzeźroczyste.

Problem można obejść dokonując konwersji ikony na bitmapę:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  TIcon *ikona = new TIcon;

  ikona->LoadFromFile(ExtractFilePath(ParamStr(0)) + "icon1.ico");

  Graphics::TBitmap *fBitmap = new Graphics::TBitmap;
  fBitmap->Width  = ikona->Width;
  fBitmap->Height = ikona->Height;
  fBitmap->Canvas->Brush->Color = ListView1->Color;
  fBitmap->Canvas->FillRect(Rect(0, 0, ikona->Width, ikona->Height));
  fBitmap->Canvas->Draw(0, 0, ikona);

  ImageList1->Add(fBitmap, NULL);

  delete ikona;
  delete fBitmap;
}


imagelist.png


Ten sposób bynajmniej nie włącza obsługi 32 bitowej, lecz odrysowuje ikonę na tle bitmapy w kolorze tła ListView. Trochę to skomplikowane, ale analiza kodu powinna wszystko wyjaśnić.
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

Re: ListView i ImageList

Nowy postprzez kwaro » wtorek, 3 sierpnia 2010, 09:37

Niestety to również nie pomogło, ponieważ ikonka jest odrysowywana razem z czarną obwódką. Próbowałem też wyszukiwać czarne piksele na bitmapie i zmieniać ich kolor na biały jednak efekt końcowy nie był zadowalający. Chyba jedynym sposobem będzie ręczne usunięcie tej obwódki w programie graficznym.
Dzięki za pomoc.
Avatar użytkownika
kwaro
Bladawiec
Bladawiec
 
Posty: 4
Dołączył(a): poniedziałek, 2 sierpnia 2010, 10:48
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++Builder 2007
Gadu Gadu: 0
    Windows XPFirefox

Re: ListView i ImageList

Nowy postprzez Cyfrowy Baron » wtorek, 3 sierpnia 2010, 10:16

Przykład pochodzi z programu, który tworzyłem w środowisku C++Builder 2006. Pamiętam jednak, że miałem problemy z TImageList i zrezygnowałem z tego komponentu, zamiast niego ikony odrysowywałem bezpośrednio w ListView, czyli bez udziału ImageList, dzięki temu nie było czarnej obwódki. To wymaga jednak przestawienia obiektu ListView w tryb OwnerDraw, trzeba również dodać obsługę zdarzenia OnDrawItem tego obiektu. Pozostaje jeszcze kwestia przechowywania w tablicy typu TIcon. Raczej nie do zastosowania w Twoim przypadku.

Popróbuj z różnymi ustawieniami obiektu ImageList:

KOD cpp:     UKRYJ  
ImageList1->BkColor = ListView1->Color; // lub clWhite lub clBlack/ lub clWhite lub clBlack
ImageList1->BlandColor     = ListView1->Color; // lub clWhite lub clBlack/ lub clWhite lub clBlack
ImageList1->DrawingStyle = dsNormal;
ImageList1->ShareImages = true;

Proponuję też pokombinować z innymi ustawieniami DrawingStyle i BkColor, gdyż wartość DrawingStyle określa sposób mieszania grafiki z tłem określonym w BkColor. BkColor nie ma zastosowania jeżeli właściwość Masked ma wartość false;
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: ListView i ImageList

Nowy postprzez kwaro » wtorek, 3 sierpnia 2010, 11:56

Pomogło ustawienie na:
ImageList1->BkColor = clWhite;
ImageList1->BlendColor = clWhite;
Teraz wszystko wyświetla się tak jak powinnno
Dzięki
Avatar użytkownika
kwaro
Bladawiec
Bladawiec
 
Posty: 4
Dołączył(a): poniedziałek, 2 sierpnia 2010, 10:48
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++Builder 2007
Gadu Gadu: 0
    Windows XPFirefox

Re: ListView i ImageList

Nowy postprzez Cyfrowy Baron » wtorek, 3 sierpnia 2010, 12:26

To nie do końca jest clWhite. Ten kolor zadziałał, gdyż w ListView masz ustawiony również kolor biały, ale jeżeli zmienisz kolor listy obiektu ListView z białego na inny to czarna ramka znów się pojawi, dlatego w kodzie programu powinieneś dodać kod:

KOD cpp:     UKRYJ  
ImageList1->BkColor = ListView1->Color;
ImageList1->BlandColor = ListView1->Color;
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 Ogólne problemy z programowaniem

Kto przegląda forum

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