 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Sab 09 Nov, 2002 11:33 am Asunto: Extraer iconos de una librería. |
|
|
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.
 _________________ ¡ADELANTE CON ESTE SUPER FORO! |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 26 Nov, 2002 11:10 pm Asunto: |
|
|
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:
Este es el resultado visual del ejemplo:
Saludos:
_Leo |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 27 Nov, 2002 1:52 pm Asunto: |
|
|
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 |
|
 |
_tugui Invitado
|
Publicado: Lun 02 Dic, 2002 7:53 pm Asunto: lo de los iconos no ha sido tan fácil. |
|
|
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!  |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 04 Dic, 2002 3:24 am Asunto: |
|
|
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 |
|
 |
_Tugui Invitado
|
Publicado: Mie 04 Dic, 2002 8:59 pm Asunto: iconos |
|
|
| Gracias Leo, como siempre has dado en el clavo. |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|