#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.
Комментарии:
1. Я ожидаю, что это ClearType на работе. Ширина символа равна X, максимальная ширина отображаемой строки учитывает ClearType и возвращает Y. (Обратите внимание, что рисунок ClearType незначительно меняется в зависимости от строки)
2. Это, безусловно, вызвано подсказкой TrueType, она растягивает форму буквы, чтобы соответствовать сетке пикселей. Я не знаю, как отключить это в машинном коде или если это вообще возможно, я знаю только Graphics::SetTextRenderingHint() .
Ответ №1:
Я обнаружил, что это действительно работает ClearType (спасибо Дианна). Отключение ClearType устраняет проблему с отображением без изменения какого-либо кода, хотя мне все еще нужно исправить, как приложение работает с ClearType.
Я также обнаружил, что проблема отсутствует в Windows XP, потому что ClearType по умолчанию отключен, тогда как в Windows 7 (и Vista) он включен по умолчанию.