Capítulo 31 Objetos básicos del usuario: El icono

Le toca el turno a otro recurso muy familiar para el usuario de Windows: el icono.

Un icono es un pequeño mapa de bits, combinado con una máscara que permite que parte de él sea transparente. El resultado es que las figuras representadas por iconos pueden tener diferentes formas, y no tienen por qué ser rectangulares.

Los usamos como ayuda para representar objetos: directorios, ficheros, aplicaciones, etc.

Punto activo

Los iconos tienen un punto activo (hot spot), como veremos que sucede también con los cursores. En el caso de los iconos, ese punto suele ser el centro, y se usa para tareas de alineación y espaciado de iconos.

Tamaños

En Windows se usan iconos en dos entornos, el sistema y el shell, y para cada uno de ellos usamos dos tamaños de icono, el grande y el pequeño.

El icono de sistema pequeño se usa en las barras de título de las ventanas. Para averiguar el tamaño de este icono hay que llamar a GetSystemMetrics con SM_CXSMICON y SM_CYSMICON.

El icono de sistema grande es que se usa normalmente en las aplicaciones, las funciones DrawIcon y LoadIcon usan por defecto, estos iconos. Para averiguar el tamaño de este icono se puede llamar a GetSystemMetrics con SM_CXICON y SM_CYICON.

El icono pequeño del shell se usa en el explorador de windows y en los diálogos comunes.

El icono grande del shell se usa en el escritorio.

Cuando creemos iconos a medida en nuestras aplicaciones, deberemos suministrar recursos de icono de los siguientes tamaños:

  • 48x48, 256 colores
  • 32x32, 16 colores
  • 16x16 pixels, 16 colores

Asociar iconos a una aplicación

Podemos decidir qué iconos usará nuestra aplicación para la barra de título, y qué icono se asocia a la aplicación al registrar la clase de ventana.

Cuando se rellena la estructura WNDCLASSEX que se usa para registrar nuestra clase de ventana, el miembro hIcon debe ser un icono de 32x32 y el miembro hIconSm uno de 16x16. Aunque ya hemos visto en algunos ejemplos que esto es opcional. Si usamos un icono de 32x32 para el hIconSm el sistema lo escalará automáticamente a 16x16.

    wincl.hIcon = LoadIcon (hThisInstance, "tajmahal");
    wincl.hIconSm = LoadIcon (hThisInstance, "lapiz");

Tipos

Existen iconos estándar disponibles para cualquier aplicación, y también es posible modificar las imágenes asociadas a esos iconos estándar, personalizando el escritorio de Windows.

Los iconos estándar son:

Icono Identificador Descripción
Aplicación IDI_APPLICATION Icono de aplicación por defecto.
Información IDI_ASTERISK Asterisco (usado en mensajes de información).
Exclamación IDI_EXCLAMATION Signo de exclamación (usado en mensajes de aviso).
Aviso importante IDI_HAND Icono de mano extentida (usado en mensajes de aviso importantes).
Interrogación IDI_QUESTION Signo de interrogación (usado en mensajes de petición de datos).
Logo IDI_WINLOGO Icono de logo de Windows.

Cargar uno de estos iconos es sencillo, basta usar la función LoadIcon, indicando como manipulador de instancia el valor NULL, y como identificador de icono, el que queramos cargar:

HICON icono = LoadIcon(NULL, IDI_EXCLAMATION);

Por otra parte, en nuestras aplicaciones podremos crear nuestros propios iconos, bien a partir de ficheros de recursos, o directamente a partir de datos binarios.

Generalmente usaremos ficheros de recursos, ya que crear iconos durante la ejecución hace que estos sean dependientes del dispositivo, y su aspecto puede ser impredecible.

En el caso de iconos de medidas normales, de 32x32 o de 16x16, se usa la función LoadIcon, en el caso de iconos de 48x48 se debe usar LoadImage:

   HICON icono1, icono2, icono3;
 
   icono1 = LoadImage(hInstance, "tajmahal", IMAGE_ICON, 0, 0, LR_LOADREALSIZE);
   icono2 = LoadIcon(hInstance, "antena");
   icono3 = LoadIcon(hInstance, "lapiz");

Iconos en ficheros de recursos

Existen programas de edición de iconos en Internet, como por ejemplo IconEdit2, que es ShareWare. (Hay que registrarse para poder guardar los ficheros de iconos). También podemos optar por usar uno de los muchos iconos de galería que se pueden encontrar en Internet.

Se pueden incluir iconos diseñados por nosotros en el fichero de recursos mediante la sentencia ICON, y obtener un manipulador para ellos usando las funciones LoadIcon o LoadImage.

antena ICON "station.ico"
lapiz ICON "fayDrafts.ico"
tajmahal ICON "tajmahal.ico"

Iconos en controles estáticos

Ya hemos usado iconos anteriormente como parte de los controles estáticos en el capítulo 10.

Mostrar iconos

En futuros capítulos veremos cómo incluirlos en menús o botones, de momento nos conformaremos con mostrarlos en pantalla.

Se puede obtener información mediante GetIconInfo, y mostrar el icono mediante DrawIconEx o DrawIcon. Si se usa el parámetro DI_COMPAT se mostrará la imagen por defecto, si no, se mostrará la imagen que indiquemos. La función DrawIconEx es más potente en el sentido de que nos permite mostrar iconos de tamaños diferentes de 32x32, y además nos permite escalarlos.

           DrawIconEx(hdc, 10, 10,
              LoadImage(hInstance, "tajmahal", IMAGE_ICON, 0, 0, LR_LOADREALSIZE),
              0, 0, 0, NULL, DI_NORMAL);
           DrawIcon(hdc, 60, 10, LoadIcon(hInstance, "antena"));
           DrawIconEx(hdc, 100, 10, LoadIcon(hInstance, "lapiz"),
              16, 16, 0, NULL, DI_NORMAL);
           DrawIcon(hdc, 140, 10, LoadIcon(NULL, IDI_APPLICATION));

Destrucción de iconos

DestroyIcon sólo se puede aplicar a iconos creados mediante CreateIconIndirect. No recomiendo usar este tipo de iconos, ya que son dependientes del dispositivo, y pueden producir resultados no deseados en algunos equipos.

Ejemplo 32


  Nombre Fichero Fecha Tamaño Contador Descarga
D Ejemplo 32 win032.zip 2004-06-24 11150 bytes 610