Можно ли определить шрифты, которые Windows выбирает для связывания шрифтов?

Предположим, у вас есть строка с текстом в двух или более сценариях. Когда вы используете функцию GDI, такую ​​​​как TextOut, (современные версии) Windows будет выполнять «связывание шрифтов». То есть GDI нарисует то, что может, с помощью выбранного вами шрифта, а остальное нарисует соответствующим шрифтом, который он выберет автоматически. Например, если часть вашего текста написана на английском языке (с использованием латинского алфавита), а часть — на китайском языке (с использованием символов CJK), и вы выбрали Arial, английская часть будет нарисована в Arial, а китайская — быть нарисованы другим шрифтом с глифами CJK.

Мой вопрос: есть ли способ определить, какие шрифты TextOut выберет (или выбрал) для привязки шрифтов?

Мне нужно нарисовать текст с помощью низкоуровневого API Uniscribe, который не выполняет автоматическое связывание шрифтов. Я реализовал свою собственную привязку шрифтов, но иногда мой алгоритм выбирает шрифт, отличный от TextOut, для того же текста. Я пытаюсь лучше понять алгоритм Windows, но я не очень хорошо разбираюсь в шрифтах (особенно в незнакомых сценариях).


person Adrian McCarthy    schedule 11.03.2010    source источник
comment
автоматически делает это чертовски хорошо! :)   -  person Andreas    schedule 06.04.2018


Ответы (1)


Шрифт выбирается записью реестра. Это хорошо описано в эта статья. Цитирование соответствующей части:

Если на вашем устройстве включено связывание шрифтов, вы можете изучить реестр, перечислив подразделы раздела реестра в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink, чтобы определить сопоставления связанных шрифтов с базовыми шрифтами. Вы можете добавить ссылки, используя Regedit для создания дополнительных подразделов.

person Hans Passant    schedule 11.03.2010
comment
Спасибо, это отличный ресурс. Но я читал в другом блоге, что эти ключи реестра нужны только для обратной совместимости и что они больше не управляют связыванием шрифтов. Например, на моей машине TextOut будет связывать шрифты для базовых шрифтов, которых нет в этой части реестра. И это также не резервный вариант шрифта, поскольку шрифты, выбранные для других сценариев, различаются в зависимости от базового шрифта. - person Adrian McCarthy; 11.03.2010
comment
Проверьте IMLangFontLink: msdn.microsoft.com/ en-us/library/aa767872%28v=VS.85%29.aspx - person Hans Passant; 11.03.2010
comment
Я использовал IMLangFontLink2 в более ранней итерации, но это вызывало проблемы, когда я смешивал сценарии LTR со сценариями RTL. Я думаю, что это довольно старое решение, и, вероятно, оно остается для обратной совместимости. - person Adrian McCarthy; 12.03.2010
comment
текущая ссылка на эту статью здесь - но, конечно, это не относится к комментарию @AdrianMcCarthy выше так или иначе. - person davidbak; 22.01.2021