【发布时间】:2012-11-14 15:12:52
【问题描述】:
我想枚举C:\Windows\Fonts\中的所有文件
首先我使用FindFirst&FindNext 来获取所有文件
代码:
Path := 'C:\Windows\Fonts';
if FindFirst(Path + '\*', faNormal, FileRec) = 0 then
repeat
Memo1.Lines.Add(FileRec.Name);
until FindNext(FileRec) <> 0;
FindClose(FileRec);
它有一些像 tahoma.ttf 这样的名称,在 windows 字体文件夹中显示 Tahoma regular。
但是我怎样才能得到呢?
第二个我为什么不能通过shell枚举C:\Windows\Fonts\中的文件
代码:
var
psfDeskTop : IShellFolder;
psfFont : IShellFolder;
pidFont : PITEMIDLIST;
pidChild : PITEMIDLIST;
pidAbsolute : PItemIdList;
FileInfo : SHFILEINFOW;
pEnumList : IEnumIDList;
celtFetched : ULONG;
begin
OleCheck(SHGetDesktopFolder(psfDeskTop));
//Font folder path
OleCheck(SHGetSpecialFolderLocation(0, CSIDL_FONTS, pidFont));
OleCheck(psfDeskTop.BindToObject(pidFont, nil, IID_IShellFolder, psfFont));
OleCheck(psfFont.EnumObjects(0, SHCONTF_NONFOLDERS or SHCONTF_INCLUDEHIDDEN
or SHCONTF_FOLDERS, pEnumList));
while pEnumList.Next(0, pidChild, celtFetched ) = 0 do
begin
//break in here
pidAbsolute := ILCombine(pidFont, pidChild);
SHGetFileInfo(LPCTSTR(pidAbsolute), 0, FileInfo, SizeOf(FileInfo),
SHGFI_PIDL or SHGFI_DISPLAYNAME );
Memo1.Lines.Add(FileInfo.szDisplayName);
end;
end;
我知道使用Screen.Fonts 可以获得字体列表,但它的显示与C:\Windows\Fonts\ 不同;
【问题讨论】:
-
也许您可以通过EnumFontFamiliesEx 或类似的方式实现您的目标。
-
如果您想要的代码与 Windows 提供的列表完全相同,那么您可能还需要特定于操作系统的代码。
-
我怀疑您的 实际 问题比自己解析字体“目录”中的文件有更好的解决方案。