GetTextMetrics возвращает разную максимальную и среднюю ширину символа для Courier New

#winapi

#c #winapi #windows-7 #размер шрифта #c builder-6

Вопрос:

Я поддерживаю приложение с использованием Borland C Builder 6, работающего в Windows 7.

Приложение неправильно рисует текст с использованием шрифта Courier New, потому что каждая буква слегка обрезается. Проблема возникает при вызове метода GetTextMetrics, поскольку он заполняет структуру TEXTMETICS разными значениями tmAveCharWidth и tmMaxCharWidth. Затем приложение использует tmAveCharWidth для вычисления ширины символа с ошибкой, потому что это значение может быть меньше, чем tmMaxCharWidth. Эту проблему я буду исправлять.

Интересно, почему GetTextMetrics возвращает разные значения tmAveCharWidth и tmMaxCharWidth для Courier New? Насколько я понимаю, Courier New — это моноширинный шрифт и что tmAveCharWidth и tmMaxCharWidth должны быть одинаковыми. Я проверил с другими моноширинными шрифтами, что это предположение верно.

Это раздел кода с проблемой:

 hFont = CreateFontIndirect(amp;lpInstData->lf);

hDC = GetDC(hWnd);
hFontOld = SelectObject(hDC, hFont);


GetTextMetrics(hDC, amp;tm);
lpInstData->nCharHeight = tm.tmHeight;
lpInstData->nCharWidth = tm.tmAveCharWidth; <--- Should be using tmMaxCharWidth 
  

Вот код, который выполняется, когда я выбрал Courier New размера 12.

Параметр, переданный в CreateFontIndirect

Структура TEXTMETRICS, возвращенная из GetTextMetrics

Комментарии:

1. Я ожидаю, что это ClearType на работе. Ширина символа равна X, максимальная ширина отображаемой строки учитывает ClearType и возвращает Y. (Обратите внимание, что рисунок ClearType незначительно меняется в зависимости от строки)

2. Это, безусловно, вызвано подсказкой TrueType, она растягивает форму буквы, чтобы соответствовать сетке пикселей. Я не знаю, как отключить это в машинном коде или если это вообще возможно, я знаю только Graphics::SetTextRenderingHint() .

Ответ №1:

Я обнаружил, что это действительно работает ClearType (спасибо Дианна). Отключение ClearType устраняет проблему с отображением без изменения какого-либо кода, хотя мне все еще нужно исправить, как приложение работает с ClearType.

Я также обнаружил, что проблема отсутствует в Windows XP, потому что ClearType по умолчанию отключен, тогда как в Windows 7 (и Vista) он включен по умолчанию.