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