MeasureString () дополняет текст слева и справа - PullRequest
16 голосов
/ 23 сентября 2008

Я использую GDI + в C ++. (Эта проблема может существовать и в C #).

Я заметил, что всякий раз, когда я вызываю Graphics :: MeasureString () или Graphics :: DrawString (), строка дополняется пробелом слева и справа.

Например, если я использую шрифт Courier (не курсивом!) И я измеряю «P», я получаю 90, но «PP» дает мне 150. Я ожидаю, что моноширинный шрифт даст ровно двойную ширину "PP".

Мой вопрос: это предполагаемое или задокументированное поведение, и как мне отключить это?

RectF Rect(0,0,32767,32767);
RectF Bounds1, Bounds2;
graphics->MeasureString(L"PP", 1, font, Rect, &Bounds1);
graphics->MeasureString(L"PP", 2, font, Rect, &Bounds2);
margin = Bounds1.Width * 2 - Bounds2.Width;

Ответы [ 5 ]

11 голосов
/ 23 сентября 2008

По замыслу этот метод не использует фактические глифы для измерения ширины и поэтому добавляет небольшое отступление в случае свесов.

MSDN предлагает использовать другой метод, если вам нужна большая точность:

Чтобы получить метрики, подходящие для соседних строк в макете (например, при реализации форматированного текста), используйте метод MeasureCharacterRanges или один из методов MeasureString , который принимает StringFormat и передать GenericTypographic . Кроме того, убедитесь, что TextRenderingHint для Графика равно AntiAlias ​​.

6 голосов
/ 12 ноября 2008

Да, это так, но ссылка на принятый ответ на самом деле не идеальна. Проблема заключается в использовании float во всех этих методах, когда вы действительно хотите использовать пиксели (дюймы).

Класс TextRenderer предназначен для этой цели и работает с истинными размерами. Посмотрите эту ссылку от MSDN для ознакомления с использованием этого.

5 голосов
/ 15 декабря 2011

Приложение StringFormat.GenericTypographic исправит вашу проблему:

graphics->MeasureString(L"PP", 1, font, width, StringFormat.GenericTypographic);

Применить тот же атрибут к DrawString.

1 голос
/ 23 сентября 2008

Звучит так, как будто это также может быть связано с хинтингом, основанным на этой статье kb, Почему текст отображается по-разному при рисовании с помощью GDIPlus и GDI

0 голосов
/ 05 декабря 2008

TextRenderer отлично подходит для получения размера шрифта. Но в цикле рисования использование TextRenderer.DrawText было мучительно медленным по сравнению с graphics.DrawString ().

Поскольку проблема заключается в ширине строки, вам лучше использовать комбинацию TextRenderer.MeasureText и graphics.DrawString ..

...