在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 firemonkey,How to use external fonts?
根据 Mr Ed 的回答,似乎在FMX中没有解决此问题的方法。但也许我们可以加载字体,如果我们在运行应用程序之前安装它。我几乎尝试了所有东西,但我仍然无法加载字体。
答案 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}行,将此文件添加到你的项目来源,理论上你应该很好。