Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Extraer iconos de una librería.

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Extraer iconos de una librería. Responder citando

Quiero que en un formulario se me muestren los iconos que corresponden a un determinado archivo con extensión .icl, pero no encuentro los controles ni funciones adecuadas.
Agradecería una ayuda.
Confused
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola Tugui:

Para saber cuantos iconos hay en un .ICL (es una dll de recursos renombrada) y extraerlos fíjate en la función ExtractIcon del API.

Aquí va un pequeño ejemplo:

- Creamos un proyecto nuevo y añadimos la cabecera:
Código:
#include<shellapi.h>

- En el evento OnPaint del Form añadimos el siguiente código:
Código:
// Pon aquí el path de tu fichero .ICL
String fichero = "C:\\miDirectorio\\iconos.icl";
int nIconos = reinterpret_cast<int>
    ( ExtractIcon(HInstance, fichero.c_str(), -1) );

Canvas->Pen->Color = clSilver;
Canvas->Brush->Color = clWhite;

for (int i=0, x=5, y=5; i<nIconos; i++)
{
    Canvas->RoundRect(x, y, x+40, y+55, 10, 10);

    HICON hIcono = ExtractIcon(HInstance, fichero.c_str(), i);
    DrawIcon(Canvas->Handle, x+4, y+4, hIcono);
    DestroyIcon(hIcono);

    Canvas->MoveTo(x+2, y+40);
    Canvas->LineTo(x+38, y+40);

    String strNum = i;
    RECT rect = { x+2, y+40, x+38, y+55 };
    DrawText(Canvas->Handle, strNum.c_str(), strNum.Length(),
        &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

    x += 45;
    y += (x>ClientWidth-45) ? x=5,60 : 0;
}

- En el evento OnResize añadimos lo siguiente:
Código:
Invalidate();

Este es el resultado visual del ejemplo:


Saludos:
_Leo
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Una segunda manera por si te es mas interesante cargar los iconos en un TImageList y visualizarlos en un TListView:

- Creamos un proyecto nuevo y añadimos un TImageList (ImageList1) y un TListView (ListView1) y en el constructor del Form añadimos el siguiente código:
Código:
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
  char szDirSistema[MAX_PATH];
  GetSystemDirectory( szDirSistema, sizeof(szDirSistema) );
  // Pon aquí el path de tu fichero .ICL
  //   como ejemplo usamos una dll con iconos
  //   que viene en todas las versiones de Windows
  String fichero = String(szDirSistema) + "\\shell32.dll";
  int nIconos = reinterpret_cast<int>
      ( ExtractIcon(HInstance, fichero.c_str(), -1) );

  ImageList1->Width = 32;
  ImageList1->Height = 32;
  ListView1->LargeImages = ImageList1;

  for (int i=0; i<nIconos; i++)
  {
    HICON hIcono = ExtractIcon(HInstance, fichero.c_str(), i);
    ImageList_AddIcon(reinterpret_cast<HIMAGELIST>(ImageList1->Handle), hIcono);
    DestroyIcon(hIcono);
    TListItem *item = ListView1->Items->Add();
    item->Caption = i;
    item->ImageIndex = i;
  }
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: lo de los iconos no ha sido tan fácil. Responder citando

El código me ha sido de gran ayuda, pero me falta pulir un pequeño detalle, y es el siguiente:

Dispongo de tres botones, el primero carga en el ListView1 los iconos que hay en un determinado archivo, el segundo carga en el mismo ListView1 los iconos que hay en otro archivo diferente, y he reservado el tercer botón para despejar el ListView1 con el método Clear().

El problema surge cuando una vez despejado el contenido del ListView1 y tras cargar en él los iconos de otro archivo lo que hace es mostrar todos los iconos de ambos archivos.
Es como si el método Clear() del ListView1 me engañara, visualmente me despeja el contenido pero al cargar los iconos de otro archivo lo que hace es sumarlos a los que había antes y los muestra todos.
¡HELP! Confused Crying or Very sad
Volver arriba
Mensaje    Asunto: Responder citando

Así sin ver el código lo único que se me ocurre es que no estes vaciando el TImageList además del TListView:

ImageList1->Clear();
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: iconos Responder citando

Gracias Leo, como siempre has dado en el clavo.
Volver arriba
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.