Windows选择字体链接时可以确定使用的字体吗?

10
假设您的字符串中包含两个或多个字符集的文本。当您使用 GDI 函数(如 TextOut)时,现代版本的 Windows 将执行“字体链接”。也就是说,GDI 会用所选的字体绘制它能够处理的内容,并自动选择适当的字体来绘制其余部分。例如,如果您的文本部分为英语(使用罗马字母),部分为中文(使用 CJK 字符),并且选择了 Arial 字体,则英语部分将以 Arial 字体绘制,而中文部分将以另一种具有 CJK 符号的字体绘制。
我的问题是,是否有办法确定 TextOut 将选择(或已经选择)哪些字体进行字体链接呢?
我必须使用低级别的 Uniscribe API 绘制一些文本,它不会自动进行字体链接。我已经实现了自己的字体链接,但有时我的算法会选择与 TextOut 不同的字体来绘制相同的文本。我正在努力更好地理解 Windows 算法,但我不太擅长从外观上识别字体(尤其在不熟悉的字符集中)。

"automagically" 很好地概括了它! :) - Andreas
1个回答

3
字体是通过注册表项进行选择的。在这篇文章中,对此有详细描述。以下是相关部分的引述:
如果您的设备启用了字体链接功能,可以通过枚举 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink 注册表键的子键来确定链接字体到基本字体的映射关系。您可以使用 Regedit 创建额外的子键来添加链接。

3
谢谢,这是一个很好的资源。但我在另一个博客中读到,那些注册表键仅用于向后兼容,并且它们实际上不再驱动字体链接。例如,在我的计算机上,TextOut将为不在注册表的基本字体进行字体链接。它也不是字体回退,因为为其他脚本选择的字体取决于基本字体。 - Adrian McCarthy
请查看IMLangFontLink:http://msdn.microsoft.com/en-us/library/aa767872%28v=VS.85%29.aspx - Hans Passant
我之前在一个版本中使用过IMLangFontLink2,但当我混合使用LTR脚本和RTL脚本时会出现问题。我认为这是一种相当旧的解决方案,可能只是为了向后兼容而存在。 - Adrian McCarthy
目前该文章的链接在这里(https://learn.microsoft.com/en-us/globalization/input/font-technology#font-linking) - 但是它并没有明确回答@AdrianMcCarthy的评论。 - davidbak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接