Firemonkey:将资源从资源添加到内存并使用它

时间:2014-01-29 14:07:03

标签: delphi fonts firemonkey delphi-xe5

VCL中,我可以从资源加载字体而不保存它我可以从内存中使用它。

以下是我使用的代码,它适用于VCL

procedure TForm1.Button1Click(Sender: TObject);
var
   ResStream  : tResourceStream;
   FontsCount : DWORD;
begin
   ResStream  := tResourceStream.Create(hInstance, 'MyResourceName', RT_RCDATA);
   winapi.windows.AddFontMemResourceEx(ResStream.Memory, ResStream.Size, nil, @FontsCount);
   ResStream.Free();
   button1.Font.name := 'MySavedFontNameInResource';
end;

在Firemonkey中我刚刚将button1.Font.name更改为button1.Font.family但不幸的是字体没有改变。所以我认为这段代码与firemonkey不兼容。

所以在Firemonkey中,如何从资源加载字体并将其临时保存到内存并直接从那里使用?

更新

我看到了这些网页:Install font in firemonkeyHow to use external fonts?

根据 Mr Ed 的回答,似乎在FMX中没有解决此问题的方法。但也许我们可以加载字体,如果我们在运行应用程序之前安装它。我几乎尝试了所有东西,但我仍然无法加载字体。

3 个答案:

答案 0 :(得分:1)

在New Delphi中还有StylesSettings.ssFamily:Boolean属性,必须设置为False才能使自定义字体系列正常工作。与Size,Style和FontColor相同。

答案 1 :(得分:1)

这可能有所帮助,也可能没有帮助。

声明

这需要我还没有进行过额外的研究,但我相信这是一个很好的起点。

MSDN页面的链接: - Custom Font Collections

您需要使用WinAPI.D2D1单元(您可能还需要FMX.TextLayout和FMX.Canvas.D2D)才能访问DirectWrite API。您可以使用它来获取DirectWrite工厂,这将允许您从磁盘定义和加载字体。

一旦你加载了字体AFAIK,它应该可用于整个应用程序,并希望所有的firemonkey控件。完全有可能firemonkey只在应用程序加载时枚举字体,所以这可能都是徒劳的。

正如我所说,这需要我还没有进行的研究,所以只有你自定义绘制你的控件(我将会是这样)并且可能不适合作为结果时才可以工作。

答案 2 :(得分:0)

我想我有一个答案,这是唯一可能的,因为内罗卡德罗的支持人员Roy Nelson给了我很多帮助,他指出了我正确的方向。

我已经确认这适用于Windows 10,64位的柏林10.1(未应用周年纪念补丁),但我不保证将适用于所有编译器版本/ Windows版本以及其他人的任何见解听到提供会非常有趣。

首先,我认为(目前)难以逾越的问题始于尝试使用 AddFontMemResourceEx ,因为它会生成不可枚举的字体,并且Firemonkey会将已安装的TrueType字体转换为图形呈现的D2D字体 - 它实际上是用它 - 它必须首先能够找到它。

AddFontMemResourceEx 替换为 AddFontResource ,并使用您从资源中编写的临时字体文件解决了该问题,但这还不够。安装完成后,您需要强制TextLayout渲染引擎重建其字体列表,您可以通过从 FMX.Canvas.D2D.pas 单元调用两行来执行此操作。

UnregisterCanvasClasses; //this tells it to forget everything it knows
RegisterCanvasClasses; //this tells it to learn it again based on the current state of this system, which now includes our dynamically loaded font.

我已经在https://github.com/TheOriginalBytePlayer/FireMonkey-Fonts在GitHub上发布了一个测试项目,供所有想要试用它的人使用。

基本上你创建一个包含字体的资源文件 - 从0到任意编号 - 用你创建的那个替换FMXFontInstaller.pas中的{$ R assimilate.res}行,将此文件添加到你的项目来源,理论上你应该很好。