目前 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 系统的缺陷。