Получить значки для распространенных типов файлов

Я хочу получить значки распространенных типов файлов в моей dll. Я использую вс++. У меня есть только расширение файла и тип mime файла, на основе которого я хочу получить значок для файла.

Может кто-нибудь, пожалуйста, скажите мне, как я могу это сделать? (Метод, доступный в vС++, требует, чтобы пользователь указал путь к файлу, для которого требуется значок. У меня нет доступа к такому файлу)

Спасибо.


person lostInTransit    schedule 07.02.2009    source источник


Ответы (2)


API оболочки

Вы можете получить их из оболочки, вызвав SHGetFileInfo(). вместе с флагом SHGFI_USEFILEATTRIBUTES - этот флаг позволяет подпрограмме работать, не требуя, чтобы переданное имя файла действительно существовало, поэтому, если у вас есть расширение файла, просто создайте имя файла, добавьте расширение и передайте его.

Комбинируя другие флаги, вы сможете получить:

  • Большой или маленький значок в зависимости от конфигурации системы: SHGFI_ICON|SHGFI_LARGEICON или SHGFI_ICON|SHGFI_SMALLICON
  • Большой или маленький значок в зависимости от конфигурации оболочки: SHGFI_ICON|SHGFI_LARGEICON|SHGFI_SHELLICONSIZE или SHGFI_ICON|SHGFI_SMALLICON|SHGFI_SHELLICONSIZE
  • Индекс значка в списке изображений оболочки вместе с соответствующим списком изображений: SHGFI_SYSICONINDEX
  • Путь и имя файла фактического модуля, в котором хранится значок (вместе с индексом значка в этом модуле): SHGFI_ICONLOCATION

Примеры

// 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);

Если вы хотите нарисовать такую ​​иконку, используйте что-то вроде этого:

// 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 );

Дескриптор значка, а также путь к файловой системе можно получить из структуры 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;

Имейте в виду, что вы должны освободить полученный значок, передав hIcon в DestroyIcon() после того, как закончите.

person newgre    schedule 07.02.2009
comment
@jn: мне понравились ваши примеры, поэтому я объединил наши ответы и удалил свои. - person Shog9; 07.02.2009

Определите информацию о значке из реестра, связанный тип файла и программу, которая обрабатывает файл, и извлеките значок из файла. http://www.codeproject.com/KB/shell/iconextract.aspx

person Priyank Bolia    schedule 07.02.2009
comment
Плохая идея - такие вещи могут меняться между версиями Windows. Придерживайтесь задокументированного интерфейса. - person MSalters; 10.02.2009