Подтвердить что ты не робот

Как я могу найти, какой шрифт действительно использовался для моего вызова CreateFont?

В Windows вызов CreateFontIndirect() может молча заменить совместимые шрифты, если запрошенный шрифт не запрашивается. GetObject() не отражает эту замену; он возвращает те же теги LOGFONT. Как я могу найти, какой шрифт был создан? В качестве альтернативы, как я могу заставить Windows только вернуть требуемый точный шрифт?

4b9b3361

Ответ 1

В Windows вызов CreateFontIndirect() может молча заменить совместимые шрифты, если запрошенный шрифт не запрашивается. Вызов GetObject() не отражает эту замену; он возвращает тот же самый LOGFONT, который прошел.

Это не CreateFontIndirect, что делает замену. Замена происходит, когда шрифт выбран в DC. CreateFontIndirect просто дает вам дескриптор внутренней копии LOGFONT. Вот почему GetObject возвращает вам тот же самый LOGFONT.

Как я могу найти, какой шрифт был создан?

Если вы выберете HFONT в целевом DC, вы можете запросить DC для получения информации о шрифте, который был фактически выбран как наилучший для LOGFONT.

  • Название лица доступно с GetTextFace.
  • Вы можете получить показатели GetTextMetrics.
  • Если выбранный шрифт - TrueType или OpenType, вы можете получить дополнительные показатели с помощью GetOutlineTextMetrics.

Это, по сути, говорит вам, какой шрифт был создан.

Помимо

Когда вы делаете что-то вроде предварительного просмотра, вы можете начать с LOGFONT, выбрать его в DC (или IC) принтера, захватить детали фактического шрифта (принтеры часто заменяют шрифты), а затем создать новый LOGFONT, который больше представитель фактического шрифта. Выберите это на экране DC, и - с соответствующими преобразованиями размера - сделайте довольно хорошее совпадение с тем, что пользователь действительно получит.

Ответ 2

Чтобы получить соответствующий шрифт на разных языковых версиях ОС, вызовите EnumFontFamiliesEx с требуемыми характеристиками шрифта в LOGFONT, затем получить соответствующее имя шрифта и создайте шрифт с помощью CreateFont или CreateFontIndirect.

Хотя это не универсальный способ получить фактическое имя шрифта из HFONT, вы можете заранее проверить, что вернет CreateFontIndirect (скорее всего).

Судя по тому, как MSDN предлагает это как хорошее решение для получения семейства шрифтов из атрибутов, похоже, что Windows внутренне выполняет подстановку.