获取Windows系统安装的字体名称极其对应的字体文件名

来源:互联网 发布:微信淘宝客 编辑:程序博客网 时间:2024/06/06 02:36

        在我们的Flex+PHP+Apache的web项目中,有个模块需要通过输入文字,设置字体,生成JPG图片。因为Flex和PHP中没有直接访问获取Windows系统字体的函数,只好用Delphi做了一个获取系统字体和对应的字体文件名的工具。原理很简单,通过Screen.Fonts中的字体名称,查询系统注册表HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Fonts下该字体名称对应的文件名即可。需要注意的是Screen.Fonts中的字体名称和注册表中的键值不一定一一对应,比如字体名称为“宋体”,对应的注册表项的键值是“宋体 & 新宋体 (TrueType) ”,所以需要做匹配查找。

代码如下:

program fontlist;

{$APPTYPE CONSOLE}

uses
  SysUtils, Forms, Classes, Registry, Windows;
  
var
  flist: TStrings;
  vlist: TStrings;
  dname: String;
  fname: String;
  i: Integer;
  f: TextFile;

procedure GetFontsValues(var vlist: TStrings);
var
  Registry: TRegistry;
begin
  Registry :
= TRegistry.Create;
  
try
    Registry.RootKey :
= HKEY_LOCAL_MACHINE;
    Registry.OpenKeyReadOnly(
'SOFTWAREMicrosoftWindows NTCurrentVersionFonts');
    Registry.GetValueNames(vlist);
  
finally
    Registry.Free;
  end;
end;

function GetRegistryValue(KeyName: 
string; ValueName: string): string;
var
  Registry: TRegistry;
begin
  Registry :
= TRegistry.Create;
  
try
    Registry.RootKey :
= HKEY_LOCAL_MACHINE;
    Registry.OpenKeyReadOnly(KeyName);
    Result :
= Registry.ReadString(ValueName);
  
finally
    Registry.Free;
  end;
end;

function GetFontFile(FontName: 
string; var FontDisplayName: string; var FontFile: string): Boolean;
var
  i: Integer;
begin
  Result :
= False;

  FontFile :
= GetRegistryValue('SOFTWAREMicrosoftWindows NTCurrentVersionFonts', FontName);
  if (FontFile <> '') then begin
    FontDisplayName :
= FontName;
    Result :
= True;
  end 
else begin
    
for i := 0 to vlist.Count - 1 do begin
      
if Pos(FontName, vlist.Strings[i]) > 0 then begin
        FontFile :
= GetRegistryValue('SOFTWAREMicrosoftWindows NTCurrentVersionFonts', vlist.Strings[i]);
        FontDisplayName := vlist.Strings[i];
        Result :
= True;
        Break;
      end
    end
  end;

end;

begin
  
{ TODO -oUser -cConsole Main : Insert code here }
  vlist :
= TStringList.Create;
  GetFontsValues(vlist);
  AssignFile(f, 
'Fonts.txt');
  Rewrite(f);
  Writeln(f, 
'<Fonts>');
  flist :
= Screen.Fonts;
  
for i := 0 to flist.Count - 1 do begin
    
if GetFontFile(flist.Strings[i], dname, fname) then begin
      Writeln(f, 
'<Font name="' + flist.Strings[i] + '" displayname="' + dname + '" filename="' + fname + '" />');
    end;
  end;
  Writeln(f, 
'</Fonts>');
  CloseFile(f);
  vlist.Free;
end.

该代码在delphi下编译后生成的文件可以在DOS窗口下运行,输出为XML格式的Fonts.txt文件。列举了系统可用的字体名称,注册表项中显示的字体全名,字体文件名。