Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.147.42.168] |
|
Сообщ.
#1
,
|
|
|
Вот, может кому потом пригодится.
uses ShellApi, Commctrl, ShlObj; const SHIL_LARGE = $00; // Отображает иконку файла размером 32x32 или 48x48 пикселей // (в зависимости от системных настроек). SHIL_SMALL = $01; // Размер иконки - обычно 16x16 (зависит от размера пользовательской иконки) SHIL_EXTRALARGE= $02; // Размер иконки - обычно 48x48 (зависит от размера пользовательской иконки) SHIL_SYSSMALL = $03; // Размер иконки определяется параметрами SM_CXSMICON и SM_CYSMICON ф-ции // GetSystemMetrics() SHIL_JUMBO = $04; // Windows Vista +. Размер иконки - обычно 256x256 пикселей. IID_IImageList: TGUID= '{46EB5926-582E-4017-9FDF-E8998DAA0950}'; function GetImageListSH(SHIL_FLAG:Cardinal): HIMAGELIST; type _SHGetImageList = function (iImageList: integer; const riid: TGUID; var ppv: Pointer): hResult; stdcall; var Handle : THandle; SHGetImageList: _SHGetImageList; begin Result:= 0; Handle:= LoadLibrary('Shell32.dll'); if Handle<> S_OK then try SHGetImageList:= GetProcAddress(Handle, PChar(727)); if Assigned(SHGetImageList) and (Win32Platform = VER_PLATFORM_WIN32_NT) then SHGetImageList(SHIL_FLAG, IID_IImageList, Pointer(Result)); finally FreeLibrary(Handle); end; end; Procedure GetIconFromFile(aFile:String; var aIcon : TIcon;SHIL_FLAG:Cardinal); var aImgList : HIMAGELIST; SFI : TSHFileInfo; Begin //Индекс в системном imagelist'е SHGetFileInfo(PChar(aFile), FILE_ATTRIBUTE_NORMAL, SFI, SizeOf( TSHFileInfo ), SHGFI_ICON or SHGFI_LARGEICON or SHGFI_SHELLICONSIZE or SHGFI_SYSICONINDEX or SHGFI_TYPENAME or SHGFI_DISPLAYNAME ); if not Assigned(aIcon) then aIcon:= TIcon.Create; //получаем дескриптор системного imagelist'а aImgList:= GetImageListSH(SHIL_FLAG); //получаем дескриптор иконки aIcon.Handle:= ImageList_GetIcon(aImgList, Pred(ImageList_GetImageCount(aImgList)), ILD_NORMAL); End; Пример использования: var Flags: Cardinal; ico: TIcon; begin ico := TIcon.Create; Flags := SHIL_LARGE; repeat GetIconFromFile(<имя_файла>, ico, Flags); ico.SaveToFile(Format('Icon Flag-%d Size-%dx%d.ico', [Flags, ico.Width, ico.Height])); Flags := Flags + 1; // следующий флаг until Flags = 5; end; Источник: http://stackoverflow.com/questions/1703186...the-vista-shell |