2010-06-16 12 views
6

ho trascorsa ore per questo (semplice) uno e non trovo una soluzione:/Delphi - popolare un imagelist con icone in fase di esecuzione 'distrugge' trasparenza

sto usando D7 e la TImageList. ImageList è assegnato a una barra degli strumenti. Quando popolo ImageList in fase di progettazione, le icone (con trasparenza parziale) stanno bene. Ma ho bisogno di popolarlo in fase di runtime, e quando lo faccio le icone sembrano piuttosto schifose - completa la trasparenza parziale.

Ho appena provato a caricare le icone da un file .res - con lo stesso risultato. Ho provato anche elenchi di immagini di terze parti senza successo. Non ho idea di cosa avrei potuto fare:/ Grazie 2 tutti;)

edit:

Per essere onesti non so esattamente cosa sta succedendo. Alpha blending è il termine correkt ... Qui ci sono 2 screenies:

Icona aggiunto al designtime: alt text http://shs-it.de/tmp/icon-designtime.JPG

Icon Added in fase di esecuzione: alt text http://shs-it.de/tmp/icon-runtime.JPG

Il tuo commento che alpha blending non è supportato solo ha portato la soluzione: Ho modificato l'immagine in un editor e rimosso i pixel "alpha blended" - e ora sembra a posto. Ma è ancora strano che le icone sembrino altre se aggiunte in fase di esecuzione anziché in fase di progettazione. Se tu (o qualcun altro;) puoi spiegarlo, sarei felice;) grazie per il tuo supporto!

+1

trasparenza parziale? Intendi miscelazione alfa? TImageList di Delphi 7 non lo supporta affatto. Sei sicuro che sia questo che intendi? Forse alcuni screenshot? –

+0

@Lars: più probabilmente, intende la trasparenza colorkey. –

+0

Stai usando file .ico o .bmp? –

risposta

0

Ho avuto esattamente gli stessi problemi un paio di anni fa. È un problema di Delphi. Ho finito per mettere le immagini nella lista in fase di progettazione, anche se davvero non volevo. Ho anche dovuto usare un elenco di immagini DevExpress per ottenere i risultati migliori e utilizzare immagini a colori a 32 bit.

0

Come ha detto Jeremy, questa è davvero una limitazione Delphi.

Una soluzione che ho usato per le immagini che inserivo sui pulsanti (PNG con trasparenza alfa nel mio caso) è quella di memorizzare i PNG come risorse e in fase di esecuzione dipingerli su una bitmap di dimensioni pulsante riempita con clBtnFace . La bitmap è stata quindi utilizzata come glifo del controllo.

Il supporto integrato di Delphi per icone con maschere alfa è molto limitato, tuttavia è disponibile un'eccellente libreria di icone kicon che può essere d'aiuto.

6

a sostenere la trasparenza alpha, è necessario creare l'elenco delle immagini e popolarlo in fase di esecuzione:

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

Ehi, quale versione delphi stai usando? Ho delphi7 e un TIcon non ha alcuna funzione "LoadFromResourceID" ... E potresti mostrare la funzione ImageList_Create? Btw. quale editor di risorse usi? thx;) – ben

+1

Il codice è per Delphi 2007. TIcon.LoadFromResourceID esegue questa operazione: Icona.Handle: = LoadIcon (Instance, MakeIntResource (ResID)); ImageList_Create è un'API di Windows (controlli comuni, comctl32.dll) dichiarata nell'unità CommCtrl. Per un editor di risorse, a volte uso resxplor dalle demo di Delphi. :-) –

+0

+1. simpatico! sfortunatamente (per me) funzionerà solo se includi manifest di XP. Sto ancora cercando una soluzione senza dover includere manifest. – kobik

Problemi correlati