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

Fonts added with AddFontResourceEx are not working in GDI+

本文关键字:GDI 不起作用 字体 AddFontresourceex 添加 使用      更新时间:2023-10-16

addfontresourceex返回每种字体的1个,但是字体在GDI 中不可访问(使用VS2015和Windows 10测试,也可以在Windows 2008 R2 Server上进行测试)。

)。 )

如果我使用Windows字体Explorer手动安装字体,一切正常。似乎GDI 找不到AddFontresourceex或AddFontresource添加的字体,任何想法我如何才能工作?

我使用使用GDI 字体渲染XAML图形的CodeJock库,因此我无法控制如何创建字体。

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 您需要使用类PrivateFontCollection,该类别用fr_private求解与addfontresourceex()相似的目的。

privateFontCollection的文档中已经有一个示例:: addfontfile(),所以我只是在评论。

该示例将Windows字体文件夹的字体添加到私有字体集合中,这是毫无意义的,因为这些字体仍然可用。您已经在AddFontresourceex()示例中的应用程序文件夹中加载字体,因此您可以使用相同的路径对PrivateFontCollection::AddFontFile()

要注意的另一件事是,只要应用程序正在运行,并且不应每次都想用这些字体绘制文本时,PrivateFontCollection对象就应该留在附近。一个好地方将是应用程序类中的成员变量。这应该很明显,但是示例使它看起来好像您每次都必须重新创建PrivateFontCollection。这将是一个重大的表现。

编辑:

我使用使用GDI 字体渲染XAML的CodeJock库图形

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

也许CodeJock直接在XAML中支持私有字体,请参见此示例,该示例适用于C#,但也许也适用于CodeJock。