如何使用外部字体?

15

如何在Delphi中直接使用资源中的字体?

我在第一步就遇到了问题,例如我无法将Segoe UI Light字体包含在项目资源中,会出现异常。这仅适用于文件扩展名为“ttf”的情况。

如果以上操作不可行,则如何在不单独部署字体(从可执行文件中)的情况下使用外部字体?

提前致谢!

2个回答

15

如果您想使用字体,那么必须安装该字体。但是您可以通过使用AddFontResource来虚拟实现字体的安装。

procedure TForm1.FormCreate(Sender: TObject) ;
begin
  AddFontResource('c:\FONTS\MyFont.TTF') ;
  SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0) ;
end;

//Before application terminates we must remove our font:
procedure TForm1.FormDestroy(Sender: TObject) ;
begin
  RemoveFontResource('C:\FONTS\MyFont.TTF') ;
  SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0) ;
end;

如你所见,AddFontResource 需要一个文件名。对于AddFontResourceEx也是一样的。

所以你需要一个字体文件。但我们也可以虚假(fake)这个文件。

使用 JVCLTjvDataEmbedded 将 TTF 文件嵌入到可执行文件中。嵌入字体文件很简单。(右键单击,“从文件加载”...)。

运行时,在用户的临时目录中提取您的文件(查看 TjvDataEmbedded 方法 - 我不知道现在是什么,但应该是类似于 SaveToFile 的东西)。顺便说一下,您可以将其提取到任何其他目录中。调用 AddFontResource

还可以根据您的要求,在内存映射文件或 RAM 驱动器中提取该文件。

希望对您有所帮助。


非常好的答案!谢谢!只有一个问题:如何使用“已安装”的字体分配TForm.Font? - Ivan Prodanov
2
@John:就技術方面而言,這很好 - 然而,你必須確保你有該字體的再分發權。 - mghie
@John:您必须知道字体的名称。这很容易-安装字体,打开WordPad(或类似软件),查看字体名称。例如,对于timesb.ttf,名称为“Times New Roman(Bold)”。因此,在您的应用程序中,您必须将字体名称(而不是文件名)分配给TForm.Font。例如,在使用上述过程安装mytimes.ttf后,您将拥有以下行:myMainForm.Font.Name:='My Times New Roman'; myMainForm.Font.Size:=10; //等等另外,请确保您表单的所有控件都具有ParentFont:= True - John Thomas
1
@John:如果你不熟悉更改字体,也许最好先尝试在“常规”字体上进行上述操作,以确保你知道它的工作原理。(这只是为了让你的“调试生活”更轻松 :-) ) - John Thomas
我的FireMonkey应用程序无法识别WM_FONTCHANGE。我该如何使用它? - sma6871

15

在Windows 2000及以上版本中,您可以使用AddFontMemResourceEx从内存安装字体到您的进程中。


正是我正在寻找的,谢谢! - Ivan Prodanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接