Может 48x48 или 64x64 значки быть полученным из Shell Vista?

Я поражен, что столько людей сразу хочет найти код, который выполняет самое быстрое. , Если ОДИН МИЛЛИОН повторений ВСЕ ЕЩЕ берет меньше, чем секунда для обработки, будет этим ВСЕГДА примечательным конечному пользователю? Не очень вероятно.

Преждевременная оптимизация = СБОЙ.

я пошел бы с String.Format опция, только потому, что она имеет большую часть смысла с архитектурной точки зрения. Я не забочусь о производительности, пока это не становится проблемой (и если бы это сделало, я спросил бы меня: я должен связать миллион имен сразу? Конечно, они не будут все соответствовать на экране...)

, Рассматривают, хочет ли Ваш клиент позже изменить его так, чтобы они могли настроить, отобразиться ли "Firstname Lastname" или "Lastname, Firstname." С Параметром формата, это легко - просто выгружают строку формата. С concat Вам будет нужен дополнительный код. Уверенный это не походит на грандиозное предприятие в этом конкретном примере, но экстраполирует.

18
задан Shay Erlichmen 9 November 2009 в 20:05
поделиться

4 ответа

You must use the SHGetImageList function, to get the image list with the larger icons.

Here you have an example in delphi

uses ShellApi, Commctrl, ShlObj;

const
  SHIL_LARGE     = $00;  //The image size is normally 32x32 pixels. However, if the Use large icons option is selected from the Effects section of the Appearance tab in Display Properties, the image is 48x48 pixels.
  SHIL_SMALL     = $01;  //These images are the Shell standard small icon size of 16x16, but the size can be customized by the user.
  SHIL_EXTRALARGE= $02;  //These images are the Shell standard extra-large icon size. This is typically 48x48, but the size can be customized by the user.
  SHIL_SYSSMALL  = $03;  //These images are the size specified by GetSystemMetrics called with SM_CXSMICON and GetSystemMetrics called with SM_CYSMICON.
  SHIL_JUMBO     = $04;  //Windows Vista and later. The image is normally 256x256 pixels.
  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
    //Get the index of the 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;
    //get the imagelist
    aImgList:= GetImageListSH(SHIL_FLAG);
    //extract the icon handle
    aIcon.Handle:= ImageList_GetIcon(aImgList, Pred(ImageList_GetImageCount(aImgList)), ILD_NORMAL);
End;

You can use these functions in this way

var
 hicon :TIcon;
begin
    hicon:= TIcon.Create;
    try
     GetIconFromFile('C:\Tools\reflector\readme.htm',hicon,SHIL_JUMBO);
     Image1.Picture.Icon.Assign(hIcon); //assign to timage
    finally
     hIcon.Free;
    end;
end;
22
ответ дан 30 November 2019 в 07:44
поделиться

We found that the index of the file was not correct because the incorrect icon was shown during testing of the code posted by RRUZ. The GetIconFromFile method was setting the index baised on the image count. We changed GetIconFromFile to use the SFI index ( aIndex := SFI.iIcon ) and the correct icon was obtained. Apparently the shellimagelist is constantly changing so the index was incorrect.

Thanks to all to assisted. This seems like a very good piece of code now.

procedure GetIconFromFile( aFile: string; var aIcon: TIcon;SHIL_FLAG: Cardinal );
var
  aImgList: HIMAGELIST;
  SFI: TSHFileInfo;
  aIndex: integer;
begin // Get the index of the 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;
  // get the imagelist
  aImgList := GetImageListSH( SHIL_FLAG );
  // get index
  //aIndex := Pred( ImageList_GetImageCount( aImgList ) );
  aIndex := SFI.iIcon;
  // extract the icon handle
  aIcon.Handle := ImageList_GetIcon( aImgList, aIndex, ILD_NORMAL );
end;
4
ответ дан 30 November 2019 в 07:44
поделиться

kicon

Я использую соответствующий метод kicon ( LoadFromFile / LoadFromModule / LoadFromModuleByIndex ) в зависимости от исходного файла. type.

, если эти методы не работают, я использую PrivateExtractIconsA :

function PrivateExtractIcons (lpszFile: PChar; nIconIndex, cxIcon, cyIcon: integer; phicon: PHandle; piconid: PDWORD; nIcons, flags: DWORD): DWORD; stdcall; внешнее имя user32.dll - PrivateExtractIconsA;

и передайте полученный дескриптор методу kicon LoadFromHandle .

после загрузки в kicon выполните итерацию по массиву icondata [], чтобы выбрать желаемый размер. У kicon есть методы для преобразования возвращенного изображения в PNG.

1
ответ дан 30 November 2019 в 07:44
поделиться

Прочтите здесь: (Код на C ++)

Добавление значков 16 × 16 и 32 × 32 Windows относительно проста и часто так просто, как один звонок ExtractIconEx.

Однако получение очень большого (48 × 48) и большие (256 × 256) значки введены соответственно XP и Vista немного сложнее. Это обычно выполняется с помощью:

  1. Получение информации о файле, в частности индекса значка, для данный файл с помощью SHGetFileInfo
  2. Получение списка образов системы, где хранятся все значки
  3. Приведение списка изображений к интерфейсу IImageList и получение icon from there
6
ответ дан 30 November 2019 в 07:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: