ttfFileNameByDescriptor的实现逻辑
ttfFileNameByDescriptor
有两个实现,一个是
OdDbBaseHostAppServices::ttfFileNameByDescriptor
,另一个是
OdDbFontServices::ttfFileNameByDescriptor
。
OdDbBaseHostAppServices::ttfFileNameByDescriptor
实际是调用
OdDbFontServices::ttfFileNameByDescriptor
。
实现逻辑:
- 从 descr 获取 typeface
- 如果 typeface 为空。
- 判断 fileName 是否直接可访问;如果不可访问,利用 findFile 找到实际的文件。
- 如果 fileName 不为空,则调用
OdDbFontServices::getTTFParamFromFile
获取 TTF 参数,并缓存 TTF 参数和 fileName 信息。 - 如果 typeface 不为空。
- 在缓存中根据 descr 信息找,找到了则返回 fileName。
- 如果缓存中没有找到。
- 在注册表
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\FontSubtitutes
中根据 typeface 找。这里是找别名。 - 再在注册表
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fonts
中根据 typeface 找。找到了则返回 fileName。 - 如果注册表中没找到,则在
%windir%\fonts
中根据 fileName 找。
从上面逻辑可以看出,它找的是系统级的字体,而 Windows 默认新装字体是安装在用户目录下的,对用注册表是
HKEY_CURRENT_USER
,存储目录是
C:\Users\MyName\AppData\Local\Microsoft\Windows\Fonts
。所以,用户级的字体它是找不到的。因此,安装字体时应安装成系统级的;如下: