2010-06-16 16 views
6

Mam przebywał godzin dla tej jednej (proste) i nie znaleźć rozwiązanie:/Delphi - Wypełnianie się imagelist z ikonami w czasie wykonywania „niszczy” przejrzystość

Używam D7 i TImageList. ImageList jest przypisany do paska narzędzi. Po zapełnieniu elementu ImageList po wygaśnięciu ikony (z częściową przezroczystością) wyglądają dobrze. Ale muszę wypełnić go w czasie wykonywania, a kiedy to zrobię, ikony wyglądają całkiem gówno - całkowicie pozbawione częściowej przezroczystości.

Po prostu próbowałem załadować ikony z pliku .res - z tym samym wynikiem. Próbowałem również list obrazów stron trzecich również bez powodzenia. nie mam pojęcia co mogę zrobić:/ Dzięki 2 wszystkich;)

edit:

Szczerze mówiąc nie wiem dokładnie, co się dzieje. Alpha blending jest correkt termin ... Oto 2 screenies:

Ikona dodane w designtime: alt text http://shs-it.de/tmp/icon-designtime.JPG

Ikona dodawane w czasie wykonywania: alt text http://shs-it.de/tmp/icon-runtime.JPG

Twój komentarz, że alfa mieszania nie jest obsługiwany tylko przyniosło rozwiązanie: Edytowałem obraz w edytorze i usunąłem "piksele" alfa - a teraz wygląda dobrze. Ale nadal jest dziwne, że ikony wyglądają inaczej po dodaniu ich w środowisku wykonawczym, a nie designtime. Jeśli ty (lub ktoś;) może to wyjaśnić, byłbym szczęśliwy;) dzięki za wsparcie!

+1

częściowym przejrzystości? Masz na myśli mieszanie alfa? TImageList Delphi 7 nie obsługuje tego w ogóle. Jesteś pewien, że o to ci chodzi? Może jakieś zrzuty ekranu? –

+0

@Lars: Bardziej prawdopodobne, że oznacza przejrzystość koloru. –

+0

Czy używasz plików .ico lub .bmp? –

Odpowiedz

0

Kilka lat temu miałem dokładnie te same problemy. To problem Delphi. Skończyło się na umieszczeniu zdjęć na liście w czasie projektowania, mimo że naprawdę tego nie chciałem. Musiałem również użyć listy obrazów DevExpress, aby uzyskać najlepsze wyniki i użyć 32-bitowych obrazów kolorowych.

0

Jak powiedział Jeremy, jest to rzeczywiście ograniczenie Delphi.

Jedna praca wokół obrazów, które umieszczałem na przyciskach (PNG z przezroczystością alfa w moim przypadku) to przechowywanie plików PNG jako zasobów, i w czasie wykonywania pomaluj je na bitmapy o rozmiarach przycisku wypełnione clBtnFace . Mapa bitowa została następnie użyta jako glif kontrolny.

Zbudowana przez Delphi obsługa ikon z maskami alfa jest bardzo ograniczona, jednak istnieje doskonała biblioteka ikon kicon, która może pomóc.

6

Aby wspierać przejrzystość alfa, trzeba utworzyć listę obrazu i wypełnić go w czasie wykonywania:

function AddIconFromResource(ImageList: TImageList; ResID: Integer): Integer; 
var 
    Icon: TIcon; 
begin 
    Icon := TIcon.Create; 
    try 
    Icon.LoadFromResourceID(HInstance, ResID); 
    Result := ImageList.AddIcon(Icon); 
    finally 
    Icon.Free; 
    end; 
end; 

function AddPngFromResource(ImageList: TImageList; ResID: Integer): Integer; 
var 
    Png: TPngGraphic; 
    ResStream: TStream; 
    Bitmap: TBitmap; 
begin 
    ResStream := nil; 
    Png := nil; 
    Bitmap := nil; 
    try 
    ResStream := TResourceStream.CreateFromID(HInstance, ResID, RT_RCDATA); 
    Png := TPNGGraphic.Create; 
    Png.LoadFromStream(ResStream); 
    FreeAndNil(ResStream); 
    Bitmap := TBitmap.Create; 
    Bitmap.Assign(Png); 
    FreeAndNil(Png); 
    Result := ImageList.Add(Bitmap, nil);    
    finally 
    Bitmap.Free; 
    ResStream.Free; 
    Png.Free; 
    end; 
end; 

// this could be e.g. in the form's or datamodule's OnCreate event 
begin 
    // create the imagelist 
    ImageList := TImageList.Create(Self); 
    ImageList.Name := 'ImageList'; 
    ImageList.DrawingStyle := dsTransparent; 
    ImageList.Handle := ImageList_Create(ImageList.Width, ImageList.Height, ILC_COLOR32 or ILC_MASK, 0, ImageList.AllocBy); 
    // populate the imagelist with png images from resources 
    AddPngFromResource(ImageList, ...); 
    // or icons 
    AddIconFromResource(ImageList, ...); 

end; 
+0

Hej, jakiej wersji delphi używasz? Mam delphi7 i TIcon nie ma funkcji "LoadFromResourceID" ... I mógłbyś pokazać funkcję ImageList_Create? Btw. jakiego edytora zasobów używasz? thx;) – ben

+1

Kod jest przeznaczony dla Delphi 2007. TIcon.LoadFromResourceID wykonuje następujące czynności: Ikona.Handle: = LoadIcon (Instancja, MakeIntResource (ResID)); ImageList_Create to interfejs API systemu Windows (wspólne sterowanie, comctl32.dll) zadeklarowany w jednostce CommCtrl. Dla edytora zasobów, czasami używam resxplor z dema Delphi. :-) –

+0

+1. miły! niestety (dla mnie) to zadziała tylko wtedy, gdy dołączymy manifest XP. Nadal szukam rozwiązania bez konieczności dołączania manifestu. – kobik