Несоответствие размера шрифта в .NET GDI +? - PullRequest
8 голосов
/ 23 августа 2010

Я ломаю голову, пытаясь понять несоответствие между размерами шрифтов, которые выбирают или задают пользователи (например, используя FontDialog ), и размером em, сообщаемым Font класс в .NET.

Например:

using (FontDialog dlg = new FontDialog()) {
    if (dlg.ShowDialog() == DialogResult.OK) {
        Console.WriteLine("Selected font size: " + dlg.Font.SizeInPoints.ToString("0.##"));
    }
}

Используя приведенный выше код, вы получите некоторые запутанные результаты:

При выборе 11 в диалоговом окне выдается 11.25

Выбор 12 в диалоговом окне дает 12

Выбор 14 в диалоговом окне дает 14,25

Выбор 16 в диалоговом окне дает 15,75

Это происходит независимо от выбранного вами шрифта. Как видно из вышесказанного, в расхождении нет никакой закономерности, она, кажется, изменяется случайным образом между +0.25 и -0.25.

Я обхожу это в пользовательских интерфейсах, когда только отображаю размер шрифта как округленное целое число, но клянусь, что видел пакеты обработки текста / DTP, которые позволяют пользователям выбирать дробные размеры шрифта - и эти пакеты не отображаются вышеуказанное поведение при взаимодействии с диалоговыми окнами шрифтов Windows.

Может ли кто-нибудь дать рациональное объяснение этому? Есть ли лучший метод для отображения размера шрифта в пользовательском интерфейсе? Как насчет того, когда пользователь хочет получить дробный размер, например «10 .5»?

Ответы [ 2 ]

12 голосов
/ 31 августа 2010

Рассмотрим следующие лакомые кусочки:

  • Дюйм, как следствие того, что эти вещи решены в истории, содержит 72 балла.
  • Обычно люди используют Windows на логическое разрешение 96 точек на дюйм.
  • Хмм, ладно, у нас есть точки, дюймы и точки - три единицы, с которыми мы здесь имеем дело.
  • GDI хочетзнать, сколько точек нарисовать, и пользователь выбирает точек .
  • Наконец, соотношение 72 точки на дюйм / 96 точек на дюйм = 0,75 точки наточка.

Это 0,75 неудачно!Это означает, что если мы позволим пользователю выбирать точки вверх, то идеальный рендеринг будет опираться только на часть логической точки.Было бы хорошо, если бы мы могли привязать весь рендеринг вверх или вниз к ближайшей целой логической точке.

Готов?Вот и мы!


  • 11:
    • 11 точек / 72 точки на дюйм = 0,153 дюйма * 96 точек на дюйм = 14,667 точек, BARF!
    • Давайте округлим до 15 точек,
    • ТАК, тогда 15 точек / 96 точек на дюйм * 72 точки на дюйм = 11,25 точки.

  • 12:
    • 12/72 * 96 = 16 точек.
    • Я могу жить с этим, не нужно выдавливать.

  • 16:
    • 16/72 * 96 = 21,3333, BARF!
    • Давайте округлим до 21 точки /96 * 72 = 15,75, намного приятнее.

Вы поняли.

Помните, что эти числа изменятся, если пользователь изменит свои логическиеразрешение (96 точек на дюйм, 120 точек на дюйм и т. д.)

1 голос
/ 23 августа 2010

в расхождении нет шаблона

Как видите, размеры шрифта происходят с шагом 0,75.

Редактировать: Вы можете точно настроить размеры, если не используете диалоговое окно шрифта, но я подозреваю, что результаты будут менее приятными, чем «предпочтительные» размеры.

...