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

AddFontResourceEx为每种字体返回1,但字体在GDI +中不可访问(使用VS2015和Windows 10testing,也在Windows 2008 R2服务器上testing)。

如果我用Windows Fonts Explorer手动安装字体,一切正常。 看来,GDI +无法find与AddFontResourceEx或AddFontResource添加的字体,任何想法我怎么能得到这个工作?

我使用CodeJock库,它使用GDI +字体来渲染XAMLgraphics,所以我无法控制如何创build字体。

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); 

Solutions Collecting From Web of "添加了AddFontResourceEx的字体在GDI +中不起作用"

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

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

该示例将Windows字体文件夹中的字体添加到无意义的专用字体集合,因为这些字体无论如何都是可用的。 您已经从AddFontResourceEx()示例中的应用程序文件夹加载字体,以便您可以使用PrivateFontCollection::AddFontFile()相同的路径。

另外需要注意的是,只要应用程序正在运行, PrivateFontCollection对象应该停留在周围,并且不应该在每次用这些字体绘制文本时重新创建。 一个好的地方是应用程序类中的一个成员变量。 这应该是显而易见的,但是这个例子使得它看起来好像每次都必须重新创建PrivateFontCollection 。 这将是一个重大的表现。

编辑:

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

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

也许CodeJock直接在XAML中支持私有字体,看这个例子是用于C#,但也可能适用于CodeJock。