Thursday, August 11, 2005

Obtener el icono asociado a un archivo.

Necesito saber el icono asociado a un archivo al igual que como ocurre en el explorador de Windows. No deseo abrirlo sino tan sólo saber el icono asociado a un archivo para poder asignárselo. Utilizo Visual Basic versión 5.

Existe una función de la API Win32 llamada SHGetFileInfo que entre otras cosas puede facilitarnos directamente un manejador del icono asociado a un archivo, con lo cual sólo tenemos que pintar este icono a partir de su manejador en la superficie de contexto que deseemos. Por ejemplo suponga que tiene en un formulario un PictureBox llamado PictureBox1 de un tamaño cualquiera (hágalo mayor de 32x32 que es el tamaño normal de un icono) y con su propiedad AutoRedraw igual a True para no perder lo que se dibuje en él. Ahora necesita averiguar el icono asociado a un archivo cualquiera que tiene en tu disco duro. Imagine que este archivo es un archivo de texto por ejemplo, llamado prueba.txt. Tiene como icono asociado una especie de libreta de notas con una espiral (el 7icono de los archivos de texto). Para averiguar su icono y dibujarlo en el PictureBox necesita tan sólo tres líneas de código que conllevan dos llamadas a la API de Win32 así como la declaración de una variable del tipo de la API
SHFILEINFO:

Dim IcoInfor As SHFILEINFO
SHGetFileInfo "C:\prueba.txt", 0, IcoInfor, Len(IcoInfor), SHGFI_ICON
DrawIconEx Picture1.hDC, 0, 0, IcoInfor.hicon, 0, 0, 0, 0, DI_NORMAL

La función SHFileInfo hace que, en el parámetro SHGFI_ICON pasado por referencia al final, se escriba información referente al icono asociado al archivo c:\prueba.txt, concretamente nos interesa el miembro hIcon de la estructura IcoInfor que es del tipo SHFILEINFO (obtenga la declaración de este tipo así como de las dos funciones empleadas a través de la utilidad API Viewer que viene con Visual Basic). Ahora mediante la función DrawIconEx pintamos el icono buscado en el PictureBox. Uso DrawIconEx en lugar de DrawIcon porque esta última sólo pinta los iconos grandes "de toda la vida" (o sea, de tamaño 32x32) mientras que DrawIconEx permite dibujar los iconos a su tamaño adecuado con tan sólo poner ceros para el ancho y el alto en sus parámetros 5º y 6º. Para averiguar el icono pequeño asociado a un archivo, sólo debemos variar un poco el código anterior añadiendo a la llamada a SHGetFileInfo la constante SHGFI_SMALLICON:

Dim IcoInfor As SHFILEINFO
SHGetFileInfo "C:\temp\pru.txt", 0, IcoInfor, Len(IcoInfor), SHGFI_ICON Or SHGFI_SMALLICON
DrawIconEx Picture1.hDC, 0, 0, IcoInfor.hicon, 0, 0, 0, 0, DI_NORMAL

No comments: