Monday, 13 July 2009

Jugando con iconos en Delphi

En éste artículo os voy a comentar un poco el tema de cargar los iconos de nuestras aplicaciones en un TImage i visualizarlos en la medida correcta e incluso reducirlos. Es un ejemplo muy simple pero que utilicé una vez para mostrar los iconos dentro de diversos componentes jugando con el canvas de la imagen. Para la ejecución de éste ejemplo utilizaré un método bastante conocido de la Win32 Shell API Interface Unit -> ExtractAssociatedIcon. Mediante éste método puedo coger el icono de un ejecutable o DLL y con el cardinal que me devuelve cargarlo en un HIcon i visualizarlo en un TImage con el método DrawIcon de la Win32 API Interface Unit. Para el ejemplo capturaré el icono de la aplicación python.exe y lo mostraré en un TImage en las medidas 32x32 y 16x16.
El primer problema que nos encontraremos al utilizar el método ExtractAssociatedIcon es que al cargar el icono y mostrarlo en el TImage nos lo carga siempre con el fondo blanco, y aquí tenemos nuestro primer problema. ¿Cómo lo quito?.
Bien, la solución es bastante simple pero no es tan fácil como indicar el color transparente y ya está, porqué no funciona. Lo que tenemos que hacer es marcar el color que nosotros queremos hacer transparente con otro color e indicar que la imagen tiene un color transparente. De esta manera mientras nosotros vayamos pintando el color de fondo, el TImage lo irá transformando a transparente.
El primer resultado que obtendremos es este:

Como podéis observar nos carga el icono pero con el fondo blanco, y yo no lo quiero. Para ésto, marco toda esta área con otro color:

A medida que voy pintando la imagen con el nuevo color, la propiedad Transparent la tengo a true, por lo tanto el resultado final aparece como en la siguiente imagen:

Ahora ya podemos utilizar estos iconos donde queramos!. Aquí os dejo el código fuente de la carga de iconos:




procedure TForm1.LoadIconClick(Sender: TObject);
procedure SetTransparentColor(image: TImage);
var
i, j: integer;
begin
image.AutoSize := true;
image.Transparent := true;

for i := 0 to image.Width - 1 do
for j := 0 to image.Height - 1 do
begin
if image.Canvas.Pixels[i, j] = clWhite then
image.Canvas.Pixels[i, j] := clred;
end;
end;
var
IconIndex: word;
Buffer: array[0..2048] of char;
IconHandle: HIcon;
begin
StrCopy(@Buffer, 'C:\Python26\python.exe');
IconIndex := 0;
IconHandle := ExtractAssociatedIcon(HInstance, Buffer, IconIndex);
if IconHandle <> 0 then
Icon.Handle := IconHandle;
DrawIcon(Image32.Canvas.Handle, 0, 0, IconHandle);
DrawIconEx(Image16.Canvas.Handle, 0, 0, IconHandle, 16, 16, 0, 0, DI_NORMAL);
SetTransparentColor(image32);
SetTransparentColor(image16);
end;



espero que os sirva de ayuda.
  • Enlaces de interés:
ExtractAssociatedIcon.

1 comment:

  1. Hey there would you mind letting me know which web host you're working
    with? I've loaded your blog in 3 different browsers and I must say this blog loads a lot quicker then most.
    Can you recommend a good web hosting provider at a fair price?

    Thank you, I appreciate it!

    Here is my website-> download video from youtube

    ReplyDelete