TextRenderer.DrawText по-разному отображает Arial в XP и Vista - PullRequest
6 голосов
/ 08 апреля 2010

У меня есть приложение ac #, которое выполняет рендеринг текста, что-то наравне с простым текстовым редактором wysiwyg.

Я использую TextRenderer.DrawText для визуализации текста на экране и GetTextExtentPoint32 для измерения текста, чтобы яМожно расположить разные стили / размеры шрифта в одной строке.

В Vista это все работает нормально.В XP, однако, Arial отображает по-разному, некоторые символы, такие как «o» и «b», занимают больше ширины, чем в Vista.GetTextExtentPoint32, кажется, измеряет строку, как это было бы в Vista, хотя и с меньшей шириной.Конечным результатом является то, что время от времени текст будет перекрывать текст, предшествующий ему, потому что предыдущий текст измеряется меньше, чем он есть на экране.

Кроме того, мой код рендеринга текста имитирует текст ieрендеринг точно (только для простого форматирования и только на английском языке), то есть рендеринг текста, кажется, согласован между vista и xp - вот как я заметил изменение в размере разных символов.

У всех есть идеи по поводу того, что происходитна?

Короче говоря, TextRenderer.DrawText и GetTextExtentPoint32 не совпадают в xp для Arial.DrawText, кажется, рисует определенные символы больше и / или меньше, чем в Vista, но GetTextExtentPoint32, похоже, измеряет текст так же, как в Vista (что, похоже, соответствует отображению текста, например, в xp и vista).Надеюсь, что это имеет смысл.

Примечание. К сожалению, TextRenderer.MeasureString недостаточно быстр и точен для удовлетворения моих требований.Я попытался использовать это и должен был вырвать это.

Ответы [ 3 ]

2 голосов
/ 09 апреля 2010

Спасибо, что нашли время ответить Адриану.

Насколько я понимаю, TextRenderer.DrawText фактически оборачивает вызов GDI, полностью игнорируя рендеринг текста GDI +. Вот почему меня смутило, что GetTextExtentPoint32 не работает с выводом.

Я думаю, что нашел проблему, хотя. Оказывается, если для Graphics.TextRenderingHint установить значение System.Drawing.Text.TextRenderingHint.ClearTypeGridFit или, возможно, для других значений, это приведет к увеличению или уменьшению размера некоторых символов в некоторых шрифтах. Это похоже на правду больше в XP, чем в Vista. Я не видел, чтобы это произошло вообще в Vista. В любом случае, похоже, что GetTextExtentPoint32 либо не способен распознать разницу, либо я не устанавливаю какой-либо флаг при выполнении вызова.

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

0 голосов
/ 09 апреля 2010

На самом деле и TextRenderer DrawText и MeasureString основаны на DrawTextEx (и это User32, а не функция Gdi). Таким образом, вы можете рассмотреть возможность использования собственных маршалловых вызовов этой функции вместо MeauseString, потому что она выполняет некоторые дополнительные вычисления (особенно если вы используете переопределение функций без HDC).

Также, возможно, этот пост будет вам полезен.

0 голосов
/ 08 апреля 2010

Я не C # парень, но я считаю, что .NET рендеринг построен на основе GDI +. Я также почти уверен, что GDI + делает свой собственный рендеринг шрифтов, который использует негласное масштабирование.

GetTextExtentPoint32, с другой стороны, является частью GDI. GDI использует подсказки по размеру, которые могут влиять на ширину символов в зависимости от размера шрифта. В целом текст GDI при небольших размерах будет выглядеть немного получше, но не будет линейно масштабироваться.

Вы должны последовательно использовать ту или иную модель для получения идеальных по пикселям результатов.

Могут быть и другие факторы, которые могут сделать это более очевидным в XP, чем в Vista, но фундаментальная проблема существует в обоих случаях. Эти другие факторы могут включать настройки DPI, масштабирование DPI, настройки ClearType или сглаживания, связывание шрифтов (если вы смешиваете скрипты из других алфавитов), замену шрифтов (особенно при печати) и, возможно, даже разные версии Arial. Я даже не уверен, что GDI + использует тот же режим отображения по умолчанию, что и GDI.

Также см. мой ответ на предварительный просмотр печати .

...