Sobre las superposiciones (overlays) en iconos

Desde hace ya tiempo, el shell de Windows ofrece la posibilidad de añadir una imagen de fondo transparente que se posicione en la esquina inferior izquierda de ciertos iconos y que sirva para añadir información acerca del icono en cuestión. Por ejemplo, el sistema añade por defecto el icono de una flecha sobre aquellos iconos que representen un acceso directo. Adicionalmente, varios clientes de Subversion como por ejemplo Tortoise SVN hacen uso de estos iconos para mostrar de manera rápida al usuario el estado de los directorios/archivos (en correcto estado, con conflictos, no actualizados con respecto a la copia del servidor SVN, etc.). Véase la siguiente imagen como ejemplo:

Imagen de Tortoise SVN

El shell limita por diseño el número de este tipo de iconos a 15 (en las primeras versiones de Windows estaban limitados a 4). De esos 15 lugares disponibles, hay 4 posiciones que están reservadas para el sistema.

La primera posición la ocupa la imagen que se agrega a los recursos compartidos:

Compartidos

La segunda posición la ocupa la clásica flecha de los accesos directos:

 

AccesoDirecto

La tercera posición en un principio la ocupaba una marca de solo lectura que estuvo presente en las primeras versiones de Windows 95 y que en versiones posteriores desapareció (aunque se mantiene como reservada por motivos de compatibilidad). En Windows 7 según he podido comprobar la posición tercera ya no está reservada y la ocupa una nueva marca que hay por ejemplo en el panel Impresoras y dispositivos para indicar que se trata del elemento por defecto de un conjunto:

ImpresoraPorDefecto

La cuarta posición la ocupa el icono que representa archivos cuyo acceso se considera lento, por residir en una cinta, por ejemplo:

AccesoLento

A partir de Windows Vista, la información de los iconos de shell definidos por el sistema es pública y extraíble a partir de la API SHGetStockIconInfo. Simplemente pasando como primer parámetro a esta función el ID de un icono de sistema, recibiremos información adicional de dicho icono en una estructura SHSTOCKICONINFO. Una de las primeras comprobaciones que se realiza antes de extraer información adicional sobre el icono es ver si este no ha sido “redirigido” por el usuario. Un usuario puede “redirigir” los iconos de shell para que se usen otros diferentes. Para ello se debe crear una clave de registro de nombre HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons y en ella valores de cadena cuyo nombre sea el índice que identifica a ese icono de shell y cuyo contenido sea la ruta del nuevo icono que queremos usar en su lugar. Este procedimiento se suele usar para quitar el icono de flecha de los accesos directos, sustituyéndolo por un icono transparente. La lista de iconos de shell está presente en MSDN. Si el icono de shell no ha sido redirigido, este se obtiene desde alguna de las DLL de sistema que contienen iconos de shell, a saber: Shell32.dll, Imageres.dll, Imagesp1.dll y Mydocs.dll (que únicamente contiene el icono de “Documentos”). Para evitar acceder a disco excesivamente, estos iconos forman parte de la cache de iconos, mantenida por el shell.

Cuando Explorer se está inicializando, debe construir la lista de imágenes del sistema. Una lista de imágenes (image list) es básicamente un bitmap grande que contiene un cierto número de imágenes del mismo tamaño, accesibles a partir de un índice entero. Las listas de imágenes permiten marcar ciertas imágenes como superposiciones (overlays), es decir, como imágenes que se mostrarán en la esquina inferior izquierda de ciertos iconos. El shell inicializa un componente que administra todas estas superposiciones denominado overlay manager. Básicamente este componente se encarga de listar aquellas superposiciones de terceros que haya registradas, hasta un máximo de 11 (15 en total menos las 4 que están reservadas por el sistema). Las superposiciones de terceros están registradas en la clave de registro HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers. Posteriormente, el sistema se encarga de invocar el método IShellIconOverlayIdentifier::GetOverlayInfo de cada una de ellas (técnicamente reciben el nombre de icon overlay handlers). La extensión de shell implementará este método de manera que le devuelva al sistema la ruta y el índice correspondientes al icono que desea agregar como superposición a la lista de imágenes del sistema.

Generalmente, las superposiciones solo se muestran para cierto tipo de ficheros (por ejemplo, aquellos que tengan una cierta extensión). El sistema llama al método IsMemberOf de la extensión de shell y le aporta como parámetro el objeto de shell en cuestión para que la extensión decida si agregar la superposición o no. Si se diera el caso de que varias superposiciones pueden mostrarse para un cierto fichero, el sistema da prioridad a las superposiciones reservadas, y dentro de ellas la superposición de acceso directo tiene cierta preferencia sobre las demás. Si estas reglas no fueran capaz de decidir qué superposición mostrar, entra en juego el concepto de prioridad. Las extensiones de shell capaces de manejar superposiciones pueden registrarse con una prioridad entre 0 y 100, siendo 0 la más prioritaria. Si hubiera varias superposiciones posibles para un mismo objeto de shell, ganará la más prioritaria de todas.

Como conclusión, el hecho de que Microsoft restrinja el uso de superposiciones a un máximo de 15 quiere hacernos indicar que las superposiciones no son una forma idónea de agregar información a un icono. Uno de los motivos principales que se indica es que solo pueden presentar simultáneamente una única información, de las muchas que pudiera haber disponibles para ese elemento.

Leave a Reply

Your email address will not be published. Required fields are marked *