【问题标题】:How to use external fonts?如何使用外部字体?
【发布时间】:2010-02-21 08:41:35
【问题描述】:

是否可以直接从 Delphi 的资源中使用字体以及如何使用?

我在最初的步骤中遇到了问题。例如,我不能在项目的资源中包含 Segoe UI Light 字体,会发生异常。只有当文件的扩展名是“ttf”时。

如果上面写的不可能,那么我如何使用外部字体而不单独部署字体(从可执行文件中)?

提前致谢!

【问题讨论】:

    标签: delphi fonts resources delphi-2009


    【解决方案1】:

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

    【讨论】:

    • 正是我要找的,谢谢!
    【解决方案2】:

    如果要使用字体,则必须安装该字体。 但是您可以使用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

    所以你需要一个字体文件。但我们也可以假装。

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

    在运行时,将您的文件提取到用户的临时目录中(请参阅 TjvDataEmbedded 方法 - 我现在不知道,但它应该类似于 SaveToFile 或类似的东西)。顺便说一句,您可以将其提取到您喜欢的任何其他目录中。拨打AddFontResource就可以了。

    此外,根据您的要求,您可以将文件提取到内存映射和/或 RAM 驱动器中。

    HTH

    【讨论】:

    • 很好的答案!谢谢!只有一件事持续:如何为 TForm.Font 分配“已安装”字体?
    • @John:就技术方面而言,这很好 - 但是您需要确保您拥有字体的再分发权。
    • @John:你必须知道字体的名称。这很容易 - 安装字体,打开写字板(或类似的)并查看字体名称出现的内容。例如。对于 timesb.ttf,名称是“Times New Roman (Bold)”。因此,在您的应用程序中,您必须将 字体名称(而不是文件名)分配给 TForm.Font。例如。安装(通过使用上述过程)mytimes.ttf 后,您将拥有以下行: myMainForm.Font.Name:='My Times New Roman'; myMainForm.Font.Size:=10; //ETC。顺便说一句,请确保表单的所有控件都有ParentFont:=True
    • @John:如果您不熟悉更改字体,最好在“常规”字体上尝试上述过程,以确保您知道它是如何工作的。 (这只是为了让您的“调试生活”更轻松:-))
    • 我的 firemonkey 应用无法识别 WM_FONTCHANGE。我该如何使用它?
    猜你喜欢
    • 2017-11-01
    • 2013-03-14
    • 2014-10-17
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多