Как получить автоматически рассчитанную ширину шрифта из объекта CFont? - PullRequest
3 голосов
/ 19 мая 2011

Я использую шрифт фиксированного размера (например, "Courier New"). Когда я инициализирую объект CFont, вызывая функцию CFont :: CreateFont, я хочу указать только высоту шрифта.

CFont Font;
Font.CreateFont( nFontHeight, 0, 0, 0, 0, false, false,
    0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
    FIXED_PITCH|FF_MODERN, _T("Courier New") );

Согласно документации, ширина шрифта будет рассчитана автоматически. Мне нужно это автоматически рассчитанное значение для какого-то другого расчета.

Функция GetLogFont бесполезна, так как кажется, что CFont содержит только значение, которое мы даем, это width = 0, и вычисляет значение только при первом использовании. (Пожалуйста, проверьте документацию Microsoft )

Другим вариантом было использование CDC :: GetTextExtent с использованием одного символа. Но в этом случае я также мог видеть некоторые незначительные различия даже в высоте. Например, когда я даю -32 в качестве высоты, GetTextExtent возвращает 33 для значения y.

Есть ли способ получить правильную рассчитанную ширину?

Ответы [ 2 ]

3 голосов
/ 19 мая 2011

Прежде всего, если вы хотите указать только высоту шрифта, вы обычно хотите использовать CreatePointFont. Во-вторых, Windows 95/98 / SE / Me умерла и ушла - и с ними, по сути, есть все основания использовать «текстовые» макросы Microsoft, такие как _T("whatever"). Если вы хотите широкие символы, попросите их напрямую:

CFont font;   
font.CreatePointFont(nFontHeight, L"Courier New");

Затем, как предлагает @MikMik, вы можете использовать GetTextMetrics для получения ширины - но только после вы выбираете шрифт в DC (GetTextMetrics получает данные для выбранного шрифта в DC, а не только для необработанного шрифта - особенно при небольших размерах шрифта, некоторые параметры настраиваются для компенсации разрешения устройства вывода).

Обратите внимание, однако, что даже для шрифта с фиксированной шириной ширина строки равна , а не обязательно char_width * num_chars. По крайней мере, если я правильно помню, даже шрифт фиксированной ширины все еще может быть зачеркнут, что означает, что интервал корректируется в зависимости от того, какие пары символов встречаются вместе. Классический пример - пара типа AV. Поскольку линии, где они находятся рядом друг с другом, как правило, находятся под одним и тем же углом (или, по крайней мере, очень близко к одному и тому же), расстояние будет скорректировано так, чтобы они были ближе друг к другу - фактически верхняя часть буквы «V» будет часто пересекаются с нижней частью «А». Ширина строки символов может варьироваться, даже если каждый отдельный символ имеет такую ​​же ширину, как и все остальные.

Случайно, я не уверен, что это делает Courier New, но я вполне уверен, что по крайней мере несколько шрифтов фиксированной ширины это делают.

2 голосов
/ 19 мая 2011

Вы пробовали CDC::GetTextMetrics()?Я никогда не использовал его, но, похоже, это то, что вы ищете.Вы можете получить среднюю и максимальную ширину символов, которая, я думаю, должна быть одинаковой для Courier New.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...