TTF字体在PC上原生平台不生效,同时所有字体的描边也不生效

如题:

  1. ttf字体在pc原生执行时不work, 显示为Arial字体。
  2. 所有字体的描边在原生运行时无效,包括系统默认字体。
    有没有知道如何解决的前辈,望指点!

示例ttf文件:HYXueJunJ.ttf
由于上传限制,我把这个ttf压缩成两个文件(HYXueJunJ.zip和HYXueJunJ.z01,又由于.z01后缀不能上传,所以我把z01改成了rar,有需要的下载后,把后缀名还原再解压)。
HYXueJunJ.zip:HYXueJunJ.zip (1.6 MB)
HYXueJunJ.z01:HYXueJunJ.rar (2 MB)

你在做PC端?

我要在PC上看效果。

目前 windows 使用的是系统的接口来绘制文本。Windows 绘制自定义字体有两步操作:

但是 lfFaceName 是和字体相关的,而这部分信息引擎没法得到。就以 HYXueJunJ.ttf 为例,对应的 lfFaceName 应该设置为 汉仪雪君体简,但是引擎没法知道这个信息,windows 系统也没有接口返回新增加的字体信息。

有一种思路是通过 EnumFontFamiliesExA 遍历系统的字体来得到新增加的系统字体,思路是:

  • 在调用 AddFontResource 前遍历系统字体并保存下来
  • 调用完 AddFontResource 后再遍历系统字体,那么多出来的字体就是新增的字体

但是这个方法有问题,如果通过 AddFontResource 加载的字体就是系统已有的字体,那么调用前后数量没有变化,无法得到哪个是新增字体。该 issue 的例子就正好是这种情况。

@youchlucky 你的问题可以通过修改 这行代码,把它改成

strcpy_s(tFont.lfFaceName, LF_FACESIZE, "汉仪雪君体简");

这种是比较 hack 的方法,而且之后所有的自定义字体就都会使用这个字体。比较好的 hack 方式应该是你自己定义一个映射关系,把字体文件名字和对应的 font face name 对应起来,然后根据文件名取对应的值。

最终的解决方案还是要通过 libfreetype 去解析加载字体,这样就会避开 windows 系统的缺陷。

感谢小明的回复,我试试云!

试过了,确实 可以的。 然后我用fontcreator把facename改成文件名一样的,就over了!
现在就是windows上的描边不work了。

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。

关联帖 pc端ttf字体不生效
用同样的方法解决了