ttfFileNameByDescriptor 有两个实现,一个是 OdDbBaseHostAppServices::ttfFileNameByDescriptor ,另一个是 OdDbFontServices::ttfFileNameByDescriptorOdDbBaseHostAppServices::ttfFileNameByDescriptor 实际是调用 OdDbFontServices::ttfFileNameByDescriptor

实现逻辑:

  1. 从 descr 获取 typeface
  2. 如果 typeface 为空。
  3. 判断 fileName 是否直接可访问;如果不可访问,利用 findFile 找到实际的文件。
  4. 如果 fileName 不为空,则调用 OdDbFontServices::getTTFParamFromFile 获取 TTF 参数,并缓存 TTF 参数和 fileName 信息。
  5. 如果 typeface 不为空。
  6. 在缓存中根据 descr 信息找,找到了则返回 fileName。
  7. 如果缓存中没有找到。
  8. 在注册表 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\FontSubtitutes 中根据 typeface 找。这里是找别名。
  9. 再在注册表 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fonts 中根据 typeface 找。找到了则返回 fileName。
  10. 如果注册表中没找到,则在 %windir%\fonts 中根据 fileName 找。

从上面逻辑可以看出,它找的是系统级的字体,而 Windows 默认新装字体是安装在用户目录下的,对用注册表是 HKEY_CURRENT_USER ,存储目录是 C:\Users\MyName\AppData\Local\Microsoft\Windows\Fonts 。所以,用户级的字体它是找不到的。因此,安装字体时应安装成系统级的;如下:

安装系统级字体

发表评论

邮箱地址不会被公开。 必填项已用*标注