2008-09-23 3 views
16

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

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

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

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

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; 

ответ

11

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

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

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

6

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

TextRenderer class предназначен для этой цели и работает с реальными размерами. См. Это link from msdn для ознакомления с этим.

+0

Я получаю лучшие результаты с помощью класса TextRenderer. – Bitterblue

+0

TextRenderer был именно тем, что мне нужно в аналогичной ситуации – Rob

+0

TextRenderer работал намного лучше для меня тоже – Migs

0

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

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

5

Append StringFormat.GenericTypographic зафиксирует ваш вопрос:

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

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

+0

GenericTypographic идеально подходит для меня, потому что я использую свой собственный запас в элементе управления в любом случае. –

+0

Почти идеальны, но маленькие подушки необходимы. – Slappy

Смежные вопросы