gpt4 book ai didi

C++——DirectWrite : Load font from file at runtime

转载 作者:搜寻专家 更新时间:2023-10-31 00:10:35 31 4
gpt4 key购买 nike

我正在尝试在运行时从文件加载字体并使用 DirectWrite 显示它。以下代码应使用该字体初始化 IDWriteTextFormat 对象:

hr = pDWriteFactory->CreateTextFormat(
L"Font Family", // Font family name
NULL, // Font collection (NULL sets it to use the system font collection)
// Somehow, a custom font collection should be used here, but I don't know how to do that
DWRITE_FONT_WEIGHT_REGULAR,
DWRITE_FONT_STYLE_NORMAL,
DWRITE_FONT_STRETCH_NORMAL,
16.0f,
L"en-us",
&pTextFormat // IDWriteTextFormat object
);

它与系统字体完美配合,但我不知道如何加载自定义字体文件。如果有任何关于如何实现这一点的示例,我将不胜感激。

到目前为止我尝试了什么:
• 我读了this articlethis question on Stackoverflow但我看不到应该在哪里传递字体文件的文件路径(因此,我完全没有实现这两页上提供的任何代码)
• 我还阅读了this article但如果我是对的,它与 DirectWrite 无关(?)(我试图实现 AddFontResourceEx 方法,但无济于事)
• 最后,this question 的答案建议使用 ResourceFontContext::CreateFontCollection 可以解决问题,但阅读后 this page (它是德语的,但屏幕截图是英语的)我相信它只能与作为资源嵌入的字体一起使用(在我的情况下这不是一个选项)

最佳答案

当然可以。你需要:

  • 在您的代码中实现IDWriteFontCollectionLoader接口(interface);

    显然,您还应该实现 IDWriteFontFileEnumerator,但这应该是微不足道的。

  • 使用 RegisterFontCollectionLoader 向工厂注册加载器

  • 使用 CreateCustomFontCollection 和相同的工厂创建一个集合;

  • 将其传递给调用同一工厂的 CreateTextFormat

当您调用 CreateCustomFontCollection 时,您必须提供一个集合键及其大小,它是一个只对您有意义的 blob,可以是任何东西。稍后将使用此 key 调用您的加载程序,因此您可以识别它。例如,您可以使用字符串“myspecialkey”作为键,并在 CreateEnumeratorFromKey 中检查它是否使用该键调用,拒绝任何其他键。

如果您只想从文件路径创建字体对象,则不需要上述任何方法,只需使用 CreateFontFileReference 后跟 CreateFontFace

关于C++——DirectWrite : Load font from file at runtime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37572961/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com