2010-06-16 34 views
6

He spended horas para esto (sencilla) y uno no encuentro una solución:/Delphi - rellenar una lista de imágenes con iconos en tiempo de ejecución 'destruye' transparencia

estoy usando D7 y la TImageList. ImageList se asigna a una barra de herramientas. Cuando llene la ImageList en designtime, los iconos (con transparencia parcial) se ven bien. Pero necesito rellenarlo en tiempo de ejecución, y cuando lo hago, los íconos se ven bastante cagados: complete la transparencia parcial.

Acabo de intentar cargar los iconos desde un archivo .res con el mismo resultado. He intentado listas de imágenes de terceros también sin éxito. que no tienen idea de lo que podía hacer:/Gracias 2 todos;)

edición:

Para ser honesto, no sé exactamente qué se está encendiendo. mezcla alfa es el término correkt ... Aquí hay 2 Screenies:

icono añadido en tiempo de diseño: alt text http://shs-it.de/tmp/icon-designtime.JPG

Icono añaden en tiempo de ejecución: alt text http://shs-it.de/tmp/icon-runtime.JPG

Su comentario de que la mezcla alfa no se admite solo trajo la solución: He editado la imagen en un editor y eliminado los píxeles "combinados alfa", y ahora se ve bien. Pero todavía es extraño que los iconos se vean otros cuando se agregan en tiempo de ejecución en lugar de designtime. Si usted (u otra persona;) puede explicarlo, sería feliz;) gracias por su apoyo!

+1

transparencia parcial? ¿Te refieres a la mezcla alfa? La TImageList de Delphi 7 no es compatible en absoluto. ¿Estás seguro de que eso es lo que quieres decir? Tal vez algunas capturas de pantalla? –

+0

@Lars: lo más probable es que se refiera a la transparencia de la clave de color. –

+0

¿Está utilizando archivos .ico o .bmp? –

Respuesta

0

Tuve exactamente los mismos problemas hace un par de años. Es un problema Delphi. Terminé poniendo las imágenes en la lista en el momento del diseño, a pesar de que realmente no quería. También tuve que usar una lista de imágenes DevExpress para obtener los mejores resultados y utilizar imágenes en color de 32 bits.

0

Como dijo Jeremy, esta es una limitación de Delphi.

Una solución que he usado para las imágenes que ponía en los botones (PNG con transparencia alfa en mi caso) es almacenar los PNG como recursos, y en tiempo de ejecución pintarlos en un mapa de bits de tamaño de botón lleno de clBtnFace . El mapa de bits se usó entonces como el glifo del control.

El soporte integrado de Delphi para iconos con máscaras alfa es muy limitado, sin embargo, hay una excelente biblioteca de iconos kicon que puede ayudar.

6

para apoyar la transparencia alfa, es necesario crear la lista de imágenes y rellenarla en tiempo de ejecución:

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

Oye, ¿Qué versión delphi estás usando? Tengo delphi7 y un TIcon no tiene la función "LoadFromResourceID" ... ¿Y podría mostrarme la función ImageList_Create? Por cierto. ¿Qué editor de recursos usas? thx;) – ben

+1

El código es para Delphi 2007. TIcon.LoadFromResourceID hace esto: Icono.Handle: = LoadIcon (Instance, MakeIntResource (ResID)); ImageList_Create es una API de Windows (controles comunes, comctl32.dll) declarada en la unidad CommCtrl. Para un editor de recursos, a veces uso resxplor de demos Delphi. :-) –

+0

+1. ¡bonito! desafortunadamente (para mí) esto funcionará solo si incluye el manifiesto de XP. Todavía estoy buscando una solución sin tener que incluir el manifiesto. – kobik

Cuestiones relacionadas