我正在构建具有附加字体(Abilene)的跨平台桌面应用程序。在启动时我检查是否安装了字体,如果没有,我安装并使用它。对于Mac,一切似乎都很好,但Windows版本(和IDE !!)不能正确显示字体。下面是字体的安装过程:Delphi Firemonkey无法正确显示字体
procedure InstallFont;
const
REG_NT = 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts';
var
Reg: TRegistry;
res: Boolean;
installName,FileName: UnicodeString;
begin
Reg := TRegistry.Create(KEY_ALL_ACCESS);
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
res := Reg.OpenKey(REG_NT, False);
if not Res then Exit;
installName := 'Abilene Regular (TrueType)';
FileName:=ExtractFilePath(ParamCount(0)+'\Abilene.ttf';
Reg.WriteString(installName, FileName);
Reg.CloseKey;
finally
Reg.Free;
end;
AddFontResourceW(PWideChar(FileName));
SendMessage(HWND_BROADCAST, WM_FONTCHANGE,0,0);
end;
安装字体后,显示为在控制面板的快捷方式,但所有其他程序可以使用它。即使是Delphi,也可以使用VCL,而不是FMX应用程序(请参阅附图)。我附加了来自IDE的图片。在运行时它是一样的。
对于字体安装,特别是对于FMX应用程序,还有什么必须额外完成的吗?或者这只是一个必须向Embarcaderro QC报告的错误?
编辑:添加一些细节:如果我通过下载它,用鼠标右键单击安装的字体,然后选择“安装”,那么一切都OK。如果我通过我的proc安装它,那么除了Delphi FMX外,字体对整个世界都是可见的和可用的。 Delphi VCL也可以使用它。为了测试这个,我在我的%APPDATA%文件夹中安装了我的proc字体。 Word,Excel,Delphi VCL都可以使用它。德尔福FMX不能。
编辑2:添加了SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0)。不用找了。
EDIT3:在字体对话框的字体正确显示图像(见图3)
这似乎对我来说都是错的。您将强制应用程序在用户每次运行时向用户显示UAC对话框,以便它可以只执行一次字体安装?将字体安装到您的安装程序中。至于FMX的具体问题,我认为这与安装权无关?即使你手动安装它,你的程序之外,你是说FMX将无法正确显示它?或者只有当您从程序安装字体时才会出现问题? –
我首先检查的是安装的字体,即如果在注册表中存在关键的Abilene Regular(TrueType),则该程序仅被跳过。 – LHristov
如果我从向导安装字体并且从不检查它,用户可以通过控制面板将其卸载 – LHristov