使用 AddFontResourceEx 添加的字体在 GDI+ 中不起作用

Fonts added with AddFontResourceEx are not working in GDI+

AddFontResourceEx returns 每种字体 1 个,但这些字体在 GDI+ 中不可访问(使用 VS2015 和 Windows 10 测试,也在 Windows 2008 R2 服务器上测试)。

如果我使用 Windows 字体资源管理器手动安装字体,一切正常。 似乎 GDI+ 找不到使用 AddFontResourceEx 或 AddFontResource 添加的字体,知道我怎样才能让它工作吗?

我使用 CodeJock 库,它使用 GDI+ 字体渲染 XAML 图形,所以我无法控制如何创建字体。

int n = 0;
CPathW pw;

pw.Combine(theApp.m_strMyAppFolder, _T("Roboto-Light.ttf"));
n =AddFontResourceEx(pw, FR_PRIVATE, nullptr);

pw.Combine(theApp.m_strMyAppFolder, _T("Roboto-Thin.ttf"));
AddFontResourceEx(pw, FR_PRIVATE, nullptr);

pw.Combine(theApp.m_strMyAppFolder, _T("Roboto-Regular.ttf"));
AddFontResourceEx(pw, FR_PRIVATE, nullptr);

pw.Combine(theApp.m_strMyAppFolder, _T("Ubuntu-R.ttf"));
AddFontResourceEx(pw, FR_PRIVATE, nullptr);

pw.Combine(theApp.m_strMyAppFolder, _T("Ubuntu-L.ttf"));
AddFontResourceEx(pw, FR_PRIVATE, nullptr);

::SendNotifyMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);

对于 GDI+,您需要使用 class PrivateFontCollection,它解决了与使用 FR_PRIVATE.

的 AddFontResourceEx() 类似的目的

PrivateFontCollection::AddFontFile() 的文档中已经有一个示例,所以我只是对此发表评论。

该示例将 Windows Fonts 文件夹中的字体添加到私有字体集合中,这毫无意义,因为这些字体无论如何都可用。 您已经在 AddFontResourceEx() 示例中从应用程序文件夹加载了字体,因此您可以对 PrivateFontCollection::AddFontFile().

使用相同的路径

另一件需要注意的事情是,只要应用程序是 运行,PrivateFontCollection 对象就应该一直存在,并且不应在每次想要使用这些字体绘制文本时重新创建。一个好的地方是应用程序中的成员变量 class。这应该是显而易见的,但是这个例子让它看起来好像你每次都必须重新创建 PrivateFontCollection 。这将是一个重大的性能损失。

编辑:

I use CodeJock Library which uses GDI+ fonts for rendering XAML graphics

PrivateFontCollection 在这种情况下可能不太容易使用,因为它不会使字体在您的应用程序中全局可用,但必须用作 Font 的构造函数参数.但是您写道,您无法控制 CodeJock 如何创建字体。

也许 CodeJock 直接在 XAML 中支持私有字体,参见 this example,它适用于 C#,但也可能适用于 CodeJock。