System.Drawing.FontFamily.GenericSansSerif - Что влияет на основной шрифт, который он выбирает? - PullRequest
4 голосов
/ 05 декабря 2011

Я рассматриваю код создания изображения, который использует FontFamily.GenericSansSerif из пространства имен system.drawing. Обычно я вижу такой код в конце инструкций выбора шрифта xhtml / css как запасной вариант / последнее средство, если более желательный (определенный) шрифт не обнаружен. Каковы параметры среды, которые будут влиять на выбранный шрифт в среде .net? Есть ли какая-нибудь диаграмма, в которой говорится, как .net framework выбирает шрифт, когда вы указываете GenericSansSerif?

Ответы [ 2 ]

3 голосов
/ 16 августа 2012

В терминах GenericSansSerif он попытается вернуть семейство из следующих шрифтов с именами «Microsoft San Serif», «Arial», «Tahoma» в указанном порядке.Если ни один из этих шрифтов не установлен, похоже, он выбирает семейство первого установленного шрифта, упорядоченного по имени.

В терминах GenericSerif он пытается вернуть семейство из шрифта с именем «Times New».Римский".Если это не установлено, используются те же правила, что и GenericSanSerif.т. е. если вы удалите шрифт «Times New Roman», он будет аналогичен вызову GenericSanSerif.

0 голосов
/ 17 августа 2012

После небольшого размышления (рефлексии?), Я думаю, я могу объяснить, как это работает.

И FontFamily.GenericSansSerif, и FontFamily.GenericSerif используют внутренний конструктор, который ищет шрифт по умолчанию в системе по его значению IntPtr. В обоих случаях он проходит IntPtr.Zero, что позволяет GDI + делать выбор (я решил не спускаться по этой конкретной кроличьей норе).

По сути, класс FontFamily запечатан и использует указатели, поэтому я не стал бы пытаться переопределить эти свойства. Вместо этого вы можете написать свой собственный метод, который имитирует поведение возврата, которое вы видите в CSS:

public FontFamily DefaultFont(params string[] fonts)
{
    // Try to return the first matching font
    foreach (var font in fonts)
    {
        try { return new FontFamily(font); }
        catch (ArgumentException) { }
    }

    // Resort to system default
    return new FontFamily(new GenericFontFamilies());
}
...