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);
答案 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。