0

次のようなフォントフォルダーアイコンを取得できます:

var
sfi : SHFILEINFO;
begin
  SHGetFileInfo('C:\Windows\Fonts\Arial' , 0 , sfi , SizeOf(sfi) , SHGFI_ICON);
  Image1.Picture.Icon.Handle := sfi.hIcon;
end;

しかし、このように失敗します:

var
sfi : SHFILEINFO;
begin
  SHGetFileInfo('C:\Windows\Fonts\ARIALN.TTF' , 0 , sfi , SizeOf(sfi) , SHGFI_ICON);  
  Image1.Picture.Icon.Handle := sfi.hIcon;
end;

フォント ファイルのアイコンを取得できないようですが、フォント フォルダは取得できます。フォント ファイルのアイコンを取得する方法を教えてください。

4

2 に答える 2

1

私の推測では、アイコンをフォント ファイルのファイル タイプ(たとえば、TTF) に関連付ける必要があると思います。その後、これを求めることができます。例えば、

var
  sfi: SHFILEINFO;
begin
  SHGetFileInfo('C:\SomeFileThatNeedNotEvenExist.ttf',
    0, sfi, SizeOf(sfi), SHGFI_USEFILEATTRIBUTES or SHGFI_ICON);
  Image1.Picture.Icon.Handle := sfi.hIcon;

TTF ファイルに関連付けられたアイコンを取得します。

于 2012-11-15T12:23:03.773 に答える
0

Windows シェルを使用してフォント ファイル アイコンを取得します。

コード :

var
  psfDeskTop : IShellFolder;
  psfFont : IShellFolder;
  pEnumList : IEnumIdList;
  pidFont : PItemIdList;
  pidChild : PItemIdList;
  FontPath : array[0..MAX_PATH - 1] of Char;
  IconFile : array[0..MAX_PATH - 1] of Char;
  pchEaten, dwAttributes, ItemsFetched : ULONG;
  ExtractIcon : IExtractIcon;
  IconIndex : Integer;
  Flags : DWORD;
  Icon : TIcon;
  LH, SH : HICon;
begin
  FillChar(FontPath, sizeof(FontPath), #0);
  //get C:\Windows\Fonts
  SHGetSpecialFolderPath(0, FontPath, CSIDL_FONTS, False);
  SHGetDesktopFolder(psfDeskTop);
  psfDeskTop.ParseDisplayName(0, nil, FontPath, pchEaten, pidFont,
    dwAttributes);
  //get font folder's interface
  psfDeskTop.BindToObject(pidFont, nil, IID_IShellFolder, psfFont);
  //Enumerate
  psfFont.EnumObjects(0, SHCONTF_FOLDERS or SHCONTF_NONFOLDERS or
    SHCONTF_INCLUDEHIDDEN, pEnumList);
  ItemsFetched := 0;

  while pEnumList.Next(1, pidChild, ItemsFetched) = NO_ERROR do
  begin

    psfFont.GetUIObjectOf(0, 1, pidChild, IID_IExtractIconW, nil,
      Pointer(ExtractIcon));

    Flags := 0;
    LH := 0;
    SH := 0;

    if Assigned(ExtractIcon) then
    begin
      IconIndex := 0;
      Icon := TIcon.Create;
      ExtractIcon.GetIconLocation(0, @IconFile, MAX_PATH, IconIndex,
        Flags);
      if (IconIndex < 0) or ((Flags and GIL_NOTFILENAME) = 0) then
        ExtractIconEx(@IconFile, IconIndex, LH, SH, 1)
      else
        ExtractIcon.Extract(@IconFile, IconIndex, LH, SH, MakeLong(32,
          16));

      //get font file icon's handle LS for large icon , SH for small icon
      //do something u want 

    end;

  end;

end;
于 2012-11-29T07:45:56.643 に答える