Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-04-2009
Chandra_ Chandra_ is offline
Miembro
 
Registrado: may 2008
Posts: 50
Poder: 17
Chandra_ Va por buen camino
Recuperando el alpha channel en un ImageList para iconos con transparencias

Hola. Me estoy volviendo loco: pongo una ToolBar en el form, le enlazo un ImageList con unas imágenes con transparencias (sacadas de iconos similares a los de XP y Vista) y el ToolButton me "recorta" la transparencia, dejando unos feísimos dientes de sierra.

¿Hay alguna forma de que conserve las transparencias de los bordes para que se vea suave?

He probado a recuperar la misma imagen .ico en un TImage, ponerle Transparent a True y ponerle detrás otro TImage. Resultado: conserva todas las transparencias (sombras, degradado del borde, etc...).

Además, se nota mucho lo del ToolBar, porque tiene el fondo degradado en negro-gris y resaltan los disntes de sierra del borde de la imagen.

¿Alguna idea? Aunque... no tengo mucha esperanza, porque veo que también lo hace en las pestañas de los PageControl si le meter iconos con bordes difuminados.

Adjunto una imagen para ilustrarlo.

Pantallazo.zip

Ah, lo olvidaba, uso Delphi 2007 for win32

Última edición por Chandra_ fecha: 19-04-2009 a las 00:34:36. Razón: Buscando la solución me he dado cuenta de que este título define mejor el problema
Responder Con Cita
  #2  
Antiguo 18-04-2009
Avatar de look
look look is offline
Miembro
 
Registrado: sep 2007
Ubicación: The Shire
Posts: 656
Poder: 17
look Va camino a la fama
Cita:
Empezado por Chandra_ Ver Mensaje
Hola. Me estoy volviendo loco: pongo una ToolBar en el form, le enlazo un ImageList con unas imágenes con transparencias (sacadas de iconos similares a los de XP y Vista) y el ToolButton me "recorta" la transparencia, dejando unos feísimos dientes de sierra.

¿Hay alguna forma de que conserve las transparencias de los bordes para que se vea suave?

He probado a recuperar la misma imagen .ico en un TImage, ponerle Transparent a True y ponerle detrás otro TImage. Resultado: conserva todas las transparencias (sombras, degradado del borde, etc...).

Además, se nota mucho lo del ToolBar, porque tiene el fondo degradado en negro-gris y resaltan los disntes de sierra del borde de la imagen.

¿Alguna idea? Aunque... no tengo mucha esperanza, porque veo que también lo hace en las pestañas de los PageControl si le meter iconos con bordes difuminados.

Adjunto una imagen para ilustrarlo.

Archivo Adjunto 1551

Ah, lo olvidaba, uso Delphi 2007 for win32
lo que hago en estos casos es utilizar el componente PNGButton, y utilizo imagenes png , queda muy bien, de otra manera va a ser muy dificil obterner el efecto que quieres..
__________________
all your base are belong to us
Responder Con Cita
  #3  
Antiguo 18-04-2009
Chandra_ Chandra_ is offline
Miembro
 
Registrado: may 2008
Posts: 50
Poder: 17
Chandra_ Va por buen camino
Cita:
Empezado por look Ver Mensaje
lo que hago en estos casos es utilizar el componente PNGButton, y utilizo imagenes png , queda muy bien, de otra manera va a ser muy dificil obterner el efecto que quieres..
Pues sí... estoy viendo que voy a tener que hacerme algún apaño de esos , porque Delphi (al menos, la versión 2007), no respeta transparencias cuando vienen de un ImageList. Lo malo es que hay componentes, como la ToolBar de la que hablo, o los PageControl, que no tienen "recambio". La única solución es usar iconos pequeñitos para que pase desapercibida la chapuza de los bordes.

Es una pena, porque otros IDEs parece que sí lo permiten (cualquier programa de VisualStudio).
Responder Con Cita
  #4  
Antiguo 19-04-2009
Chandra_ Chandra_ is offline
Miembro
 
Registrado: may 2008
Posts: 50
Poder: 17
Chandra_ Va por buen camino
Solucionado!

Al final lo he solucionado

Pego a continuación el código, por si a alguien le sirve. Hace falta un ImageList vacío y hay que asignar ese ImageList al componente(es) que queremos que tenga las imágenes. No olvidéis meter en uses CommCtrl y Consts, que si no, se quejará amargamente.

Código Delphi [-]
procedure TForm1.ConvertTo32BitImageList(ImageList: TImageList);
const
  Mask: array[Boolean] of Longint = (0, ILC_MASK);
var
  TempList: TImageList;
begin
  if Assigned(ImageList) then begin
    TempList := TImageList.Create(nil);
    try
      TempList.Assign(ImageList);
      with ImageList do begin
        Handle := ImageList_Create(Width, Height, ILC_COLOR32 or Mask[Masked],
                    0, AllocBy);
        if not HandleAllocated then
          raise EInvalidOperation.Create(SInvalidImageList);
      end;
      Imagelist.AddImages(TempList);
    finally
      FreeAndNil(TempList);
    end;
  end;
end;

...y así se usa (lo he metido en el evento OnClick de un Button, para probarlo, pero iría, por ejemplo, en el FormCreate):

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  Ico: TIcon;
begin
  Ico := TIcon.Create;
  try
     ConvertTo32BitImageList(ImageList1);
   Ico.LoadFromFile('icono.ico');
   ImageList1.AddIcon(Ico);
   Ico.LoadFromFile('otroicono.ico');
   ImageList1.AddIcon(Ico);
  finally
    Ico.Free;
  end;

Según he averiguado, es un viejo problema del ImageList y sólo se soluciona como he hecho más arriba: cargando en tiempo de ejecución las imágenes en el ImageList a trabés de un TIcon (porque los TIcon mantienen el canal alfa de las imágenes) y luego pasándoselas a nuestro ImageList, que está enlazado a los componentes.

Pues eso, que funciona perfectamente... pero hay un problemilla que estoy tratando de solucionar ahora mismo: no me funciona con imágenes mayores de 32x32, me da un error de tamaño incompatible. He trazado el programa y el error aparece cuando se trata de cargar la imagen de 48x48 en el TIcon. He tratado de cambiarle el Height y el Width tras crearlo, pero ni caso... También he estado investigando a ver si puedo especificar el tamaño del TIcon en el mismo constructor, pero no hay manera.

En fin, si alguien se anima a echarle un vistazo, se lo agradeceré

Última edición por Chandra_ fecha: 19-04-2009 a las 00:51:40.
Responder Con Cita
  #5  
Antiguo 19-04-2009
Chandra_ Chandra_ is offline
Miembro
 
Registrado: may 2008
Posts: 50
Poder: 17
Chandra_ Va por buen camino
¿Es que un TIcon no puede ser más grande de 32x32? Es que lo estoy intentando con todos los tamaños y el error de tamaño no válido me lo da cuando salto de 32x32 a 48x48. 16x16 va también sin problemas

Por supuesto, cada vez que cambio el tamaño del archivo de icono, pongo también ese mismo tamaño en el Height y el Width del ImageList1. Pero nada... el TIcon se atranca en 48x48...

ACTUALIZACIÓN: Acabo de probar a 33x33 y no funciona. El límite del TIcon está en 32x32. A ver cómo me las ingenio yo ahora para pasarle la imagen al ImageList, que sólo acepta bitmaps (inútiles parta este propósito, pues no tienen canal alfa) e imágenes tipo TIcon...

ACTUALIZACIÓN2: Pues me he equivocado . Dónde falla es una línea más abajo:

Código Delphi [-]
ImageList1.AddIcon(Ico);

Es decir, al asignar el TIcon al ImageList es cuando salta el error de "Invalid Image Size". Y no lo entiendo, porque tengo el ImageList1 en 48x48 en las propiedades Width y Height del Object Inspector. O sea, que debe ser la procedure ConvertTo32BitImageList la que joroba esos valores...

ACTUALIZACIÓN 3: ¡Quito el salto a la procedure y sigue fallando! Me estoy volviendo loco No entiendo nada

ACTUALIZACIÓN 4: Delphi se está cachondeando de mi:

A) meto un TrayIcon en el formulario (por aquello de que tiene un TIcon como imagen, que es compatible con el tipo de imagen del ImageList), lo cargo con un icono de 48x48, le asigno el contenido de la imagen del TrayIcon al ImageList (en lugar de hacer lo de "Ico.LoadFromFile('icono.ico');", y me dice lo de siempre: "Invalid Image Size" (¡¿por qué, si el TrayIcon lo ha aceptado?!).

B) Me doy cuenta de que los TrayIcon tienen la propiedad Visible en False... la pongo en True, por si acaso, y ahora... FUNCIONA (¡¡¡¿¿¿Por qué???!!!). La solución, obviamente, nome sirve de nada: no puedo llenar la pantalla del usuario de iconos de notificación para hacer mi chapuza con el ImageList...

C) Me voy a la cama

Última edición por Chandra_ fecha: 19-04-2009 a las 02:52:41.
Responder Con Cita
  #6  
Antiguo 19-04-2009
Chandra_ Chandra_ is offline
Miembro
 
Registrado: may 2008
Posts: 50
Poder: 17
Chandra_ Va por buen camino
Esto funciona con iconos de 48x48 (es ABSURDO, pero funciona):

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  Ico: TIcon;
begin
  Ico := TIcon.Create;
  try
   ConvertTo32BitImageList(ImageList1);
   Ico.LoadFromFile('icono48x48.ico');
   //   ImageList1.AddIcon(Ico);   <--- aquí falla
   TrayIcon1.Icon := Ico;
   ImageList1.AddIcon(TrayIcon1.Icon);
  finally
    Ico.Free;
  end;

Si pongo lo siguiente, deja de funcionar y vuelve con la chorrada del tamaño:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
   ConvertTo32BitImageList(ImageList1);
   TrayIcon1.Icon.LoadFromFile('icono48x48.ico');
   ImageList1.AddIcon(TrayIcon1.Icon);
 end;
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
ToolBar Paulao Varios 5 14-10-2008 22:47:49
Ayuda con ToolBar ManuelPerez Varios 0 05-03-2008 12:53:57
toolbar ercrizeporta Varios 3 17-09-2007 18:10:52
Problema con un toolbar mavm03 C++ Builder 6 02-10-2006 17:57:02
mover una toolbar Javi2 Varios 2 25-02-2005 18:56:57


La franja horaria es GMT +2. Ahora son las 22:57:33.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi