Получить значки для распространенных типов файлов - PullRequest
10 голосов
/ 07 февраля 2009

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

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

Спасибо.

Ответы [ 2 ]

19 голосов
/ 07 февраля 2009

Shell 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() после того, как с ней покончено.

0 голосов
/ 07 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...