在firemonkey中安装字体

时间:2013-04-13 07:39:01

标签: delphi firemonkey delphi-xe3

如何在firemonkey应用程序中使用嵌入字体或安装新字体?

我尝试了this solution,但未在FMX中定义WM_FONTCHANGE

我想在我的应用程序中使用自定义字体,我该怎么做?

2 个答案:

答案 0 :(得分:3)

我按照这里的说明,他们提供了一些帮助。我有一些可能有用的额外提示,

  • 您需要完成这项工作的两个内容是WinAPI.Windows和WinAPI.Messages。
  • 如果您将这些内容放在“使用”子句的开头,则不太可能与TBitmap等名称冲突。

现在,我添加了以下代码,

procedure TMainForm.FormCreate(Sender: TObject);
begin
  AddFontResource('c:\fontpath\myfont.ttf');
  SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0) ;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  RemoveFontResource('c:\fontpath\myfont.ttf');
  SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0) ;
end;

当我以firemonkey形式运行时,我观察到以下情况。

  1. 代码运行
  2. 其他应用程序(例如记事本,办公室)可以突然看到新字体
  3. 我的应用程序中的文本对象无法识别新字体
  4. 如果我使用字体名称动态命名我的文本对象,它仍然不会改变。
  5. 如果我用另一种明显的字体动态命名我的文本对象,它就会改变。
  6. 如果我关闭我的应用程序,其他应用程序将停止查看新字体。
  7. 这告诉我我的代码有效(请参阅项目符号1.和6.) - 但如果使用记事本中显示的名称,FMX将无法识别主表单上的字体。我已经四倍检查了字体名称。

    我创建了两个相同的项目。一个是VCL,另一个是FMX。 VCL项目非常适用于静态文本和动态文本。 FMX代码既不适用也适用。如果我不得不冒险猜测,我会说FMX正在构建启动时的字体列表,并检查该列表中的可用字体列表(即像缓存一样)。我猜想这是为了从底层操作系统中抽象出FMX ......

    如果有人在firemonkey下完成这项工作,我将不胜感激任何建议。 此外,如果有人知道如何在Mac下实现相同的目标,我也会感激指针。

    此致

    Ed先生。

答案 1 :(得分:1)

您肯定可以使用FMX应用中明确定位到Windows的Winapi.Messages单元,并在那里定义消息常量。

如果您不想使用Winapi.Messages,只需在您自己的代码中定义常量:

const
  WM_FONTCHANGE = $001D;