Как я могу найти, какой шрифт был фактически использован для моего вызова CreateFont? - PullRequest
14 голосов
/ 23 августа 2011

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

Ответы [ 2 ]

15 голосов
/ 25 августа 2011

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

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

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

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

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

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

За исключением:

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

1 голос
/ 25 августа 2011

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

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

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

...