0

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

我尝试了这个解决方案,但WM_FONTCHANGE没有在 FMX 中定义!

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

4

2 回答 2

3

我按照此处的说明进行操作,它们有所帮助。我有一些额外的提示可能会有所帮助,

  • 完成这项工作所需的两个包含项是 WinAPI.Windows 和 WinAPI.Messages。
  • 如果您将这些包含在“uses”子句的开头,您不太可能与 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. 如果我关闭我的应用程序,其他应用程序将停止看到新字体。

这告诉我我的代码有效(参见项目符号 1. 和 6.) - 但如果您使用记事本中出现的名称,FMX 将无法识别我的主窗体上的字体。我已经四次检查了字体名称。

我创建了两个相同的项目。一个是 VCL,另一个是 FMX。VCL 项目完美运行——无论是静态文本还是动态文本。FMX 代码两者都不起作用。如果我不得不冒险猜测,我会说 FMX 在启动时构建一个字体列表,并根据该列表检查可用字体列表(即像缓存一样)。我冒昧地猜测这样做是为了从底层操作系统中抽象 FMX ......

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

问候,

埃德先生

于 2013-08-24T00:48:16.023 回答
1

您当然可以Winapi.Messages在明确针对 Windows 的 FMX 应用程序中使用该单元,并且在那里定义了消息常量。

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

const
  WM_FONTCHANGE = $001D;
于 2013-04-13T08:29:32.210 回答