Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Как заполнить ListView ассоциированными значками?


Автор: navodri 23.9.2020, 09:36
Есть SysListView32, который я заполняю определенными файловыми расширениями, например: .txt, .doc и т.д. Как мне прикрутить функцию, представленную ниже?

Код

function GetAssociatedIcon(const AExtension: string; ASmall: Boolean): HIcon;
var
 Info: TSHFileInfo;
 Flags: Cardinal;
begin
 if ASmall 
  then Flags := SHGFI_ICON or SHGFI_SMALLICON or SHGFI_USEFILEATTRIBUTES
  else Flags := SHGFI_ICON or SHGFI_LARGEICON or SHGFI_USEFILEATTRIBUTES;
 SHGetFileInfo(PChar(AExtension), FILE_ATTRIBUTE_NORMAL, Info, SizeOf(TSHFileInfo), Flags);
 Result := Info.hIcon;
end;


К примеру, если я ставлю Bitmap'ы из ресурсов, то это будет так:

Код

  //ставим Bitmap'ы (100) из ресурсов
  imgs:=ImageList_LoadImage(hInstance,PChar('100'),16,5,CLR_NONE,
             IMAGE_BITMAP, LR_DEFAULTCOLOR or LR_LOADTRANSPARENT);
  //заполняем ImageList
  ListView_SetImageList(hwndList,imgs,LVSIL_SMALL);
  //далее вытаскиваем по индексу
  TLVITEM.iImage:=0


Но здесь я ставлю иконки, которые заранее нарисованы, а хотелось бы как-то прикрутить вышеуказанную функцию, которая устанавливает ассоциированные значки.

Автор: Hiori 3.10.2021, 20:39
еще актуально?

Код

{
>> Получение системной иконки, ассоциированной с файлом в данной системе

Функция позволяет получить такую же иконку любой директории или любого файла,
какую вы видите в "проводнике". Размеры - 16 * 16 (по умолчанию) или 32 * 32
(второй параметр - itLarge)

Зависимости: Юниты VCL + ComObj, ActiveX, ShellApi, ShlObj;
Copyright:   Взято из MSDN
}
function ExtractIconFromExe( const FileName: string; const IconType: TIconType = itSmall ): TIcon;
var
  FileInfo: TShFileInfo;
  ImageList: TImageList;
  IT: DWORD;
begin
  IT := SHGFI_SMALLICON;
  Result := TIcon.Create;
  ImageList := TImageList.Create( nil );
  if( IconType = itLarge )then begin
     IT := SHGFI_LARGEICON;
     ImageList.Height := 32;
     ImageList.Width := 32;
  end;
  FillChar( FileInfo, Sizeof( FileInfo ), #0 );
  ImageList.ShareImages := true;
  ImageList.Handle := SHGetFileInfo( PChar( FileName ), SFGAO_SHARE, FileInfo, sizeof( FileInfo ), IT or SHGFI_SYSICONINDEX );
  ImageList.GetIcon( FileInfo.iIcon, Result );
  ImageList.Free;
end;


и в типы
Код

TIconType = (itSmall, itLarge);


увидела, что нет smile год перепутала

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)