c++ - texto - Obtener iconos para tipos de archivos comunes
tipos de archivos y extensiones en informatica (2)
Quiero obtener los iconos de tipos de archivos comunes en mi dll. Estoy usando vc ++. Solo tengo la extensión de archivo y el tipo de mime del archivo en función del cual quiero obtener el ícono para el archivo.
¿Puede alguien decirme cómo puedo hacer eso? (El método disponible en vc ++ necesita que el usuario proporcione la ruta del archivo para el que se necesita el icono. No tengo acceso a ningún archivo de este tipo)
Gracias.
Shell API
Puede obtenerlos desde el shell llamando a SHGetFileInfo()
junto con el indicador SHGFI_USEFILEATTRIBUTES
: este indicador permite que la rutina funcione sin requerir que el nombre de archivo pasado realmente exista, de modo que si tiene una extensión de archivo solo crea un nombre de archivo, agregue el extensión, y pasarlo adentro.
Al combinar otros indicadores, podrá recuperar:
- Un icono grande o pequeño como lo determina la configuración del sistema :
SHGFI_ICON|SHGFI_LARGEICON
oSHGFI_ICON|SHGFI_SMALLICON
- Un icono grande o pequeño como lo determina la configuración del shell :
SHGFI_ICON|SHGFI_LARGEICON|SHGFI_SHELLICONSIZE
oSHGFI_ICON|SHGFI_SMALLICON|SHGFI_SHELLICONSIZE
- El índice del icono en la lista de imágenes del shell junto con la lista de imágenes adecuada:
SHGFI_SYSICONINDEX
- La ruta y el nombre del archivo del módulo real donde se almacena el ícono (junto con el índice de ícono en ese módulo):
SHGFI_ICONLOCATION
Ejemplos
// Load a System Large icon image
SHGetFileInfo( szFileName, FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(SHFILEINFO),
SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_LARGEICON);
// Load a System Small icon image
SHGetFileInfo( szFileName, FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(SHFILEINFO),
SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_SMALLICON);
// Load a Shell Large icon image
SHGetFileInfo( szFileName, FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(SHFILEINFO),
SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_SHELLICONSIZE);
// Load a Shell Small icon image
SHGetFileInfo( szFileName, FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(SHFILEINFO),
SHGFI_USEFILEATTRIBUTES
| SHGFI_ICON | SHGFI_SHELLICONSIZE | SHGFI_SMALLICON);
Si desea dibujar un icono de este tipo, use algo como esto:
// Draw it at its native size
DrawIconEx( hDC, nLeft, nTop, hIcon, 0, 0, 0, NULL, DI_NORMAL );
// Draw it at the System Large size
DrawIconEx( hDC, nLeft, nTop, hIcon, 0, 0, 0,
NULL, DI_DEFAULTSIZE | DI_NORMAL );
// Draw it at some other size (40x40 in this example)
DrawIconEx( hDC, nLeft, nTop, hIcon, 40, 40, 0, NULL, DI_NORMAL );
El identificador de icono y la ruta del sistema de archivos se pueden obtener de la estructura SHFILEINFO
:
typedef struct _SHFILEINFOA
{
HICON hIcon; // out: icon
int iIcon; // out: icon index
DWORD dwAttributes; // out: SFGAO_ flags
CHAR szDisplayName[MAX_PATH]; // out: display name (or path)
CHAR szTypeName[80]; // out: type name
} SHFILEINFOA;
Tenga en cuenta que debe liberar el icono obtenido al pasar hIcon
a DestroyIcon()
después de que haya terminado con él.
Identifique la información del icono del registro, el tipo de archivo asociado y el programa que maneja el archivo y extraiga el ícono del archivo. http://www.codeproject.com/KB/shell/iconextract.aspx