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

时间:2017-03-04 12:12:17

标签: c++ windows fonts gdi+

AddFontResourceEx为每种字体返回1,但在GDI +中无法访问这些字体(使用VS2015和Windows 10测试,也在Windows 2008 R2 Server上)。

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

我使用CodeJock Library,它使用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);

1 个答案:

答案 0 :(得分:2)

对于GDI +,您需要使用类PrivateFontCollection,它解决了与使用FR_PRIVATE的AddFontResourceEx()类似的目的。

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

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

另外需要注意的是,只要应用程序正在运行,PrivateFontCollection对象就应该保持不变,并且每次想要使用这些字体绘制文本时都不应该重新创建。一个好的地方是应用程序类中的成员变量。这应该是显而易见的,但该示例使您看起来好像每次都必须重新创建PrivateFontCollection。这将是一个重大的性能影响。

修改

  

我使用CodeJock Library,它使用GDI +字体来渲染XAML   图形

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

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