Шрифт по умолчанию для приложения Windows Forms

каждый раз, когда я создаю новую форму в своем приложении, он использует шрифт "Microsoft Sans Serif, 8.25 pt" по умолчанию. Я не меняю его, потому что знаю, что в этом случае моя форма должны подобрать любой шрифт по умолчанию для системы. Однако, когда я запускаю свое приложение, используемый шрифт по-прежнему ничего, кроме Segoe UI (мой системный шрифт по умолчанию в моей ОС Windows Vista).

Почему это происходит? Как убедиться, что мое приложение выглядит как обычное приложение для Windows?

8 ответов


зацените запись в блог говоря о шрифте по умолчанию в формах, что приводит к проблеме, которую вы испытываете, и это Подключения Ошибка С ответом Microsoft. Короче говоря, кажется, что формы не получают (правильный) шрифт windows по умолчанию (который вы изменили).


принятый ответ на самом деле не отвечает на вопрос; он просто объясняет, почему такое поведение происходит.

некоторые из других ответов предлагают твердые обходные пути, но я обнаружил, что лучшим решением действительно является создание базовой формы, которую все формы в вашем приложении наследуют, и установить свойство шрифта этой базовой формы в SystemFonts.MessageBoxFont в конструкторе. Это не только гарантирует, что ваше приложение выбирает правильный шрифт во время выполнения, на основе среды пользователя (возглавляя потенциальную проблему, поставленную Хансом Пассантом-XP без Office 2007 будет прибегать к Microsoft без засечек в отсутствие Segoe UI), но также дает вам разработки поддержка текущего шрифта Windows. Использование правильного шрифта во время разработки решает проблему, на которую указывает Josuegomes, потому что любой элемент управления контейнером, созданный на форме, подберет шрифт, используемый формой во время разработки.

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

единственная проблема, которая остается с этим подходом, если вы хотите установить стиль шрифта для конкретного элемента управления, например, полужирный. Лучшее место для этого все еще в конструктор этой формы, начиная с шрифта формы в качестве основы и изменяя стиль из него:

myControl.Font = New Font(Me.Font, FontStyle.Bold)

вы можете добавить перед InitializeComponent () в конструкторе(конструкторах) формы:

this.Font = SystemFonts.MessageBoxFont;

это работает с Windows XP и Windows Vista.


Да, он использует шрифт, возвращенные GetStockObject(DEFAULT_GUI_FONT). Это мисс без засечек. Старый шрифт, давно исчезнувший с большинства машин. Сопоставитель шрифтов перевести его, не удивительно, Microsoft без засечек.

нет документированной процедуры, которую я знаю, чтобы изменить этот шрифт по умолчанию, документы SDK явно упоминают MS Sans Serif. Если вы хотите, чтобы шрифт Segoe, вы должны спросить за это. Что не так безопасно делать, есть еще много машин XP без Office 2007. Сопоставитель шрифтов будет переведите его на машину, у которой нет Segoe. Не уверен, что выскочит, у меня больше нет такой машины.


установка свойства шрифта формы в SystemFonts.DialogFont не работает, если у вас есть групповые поля со связанными элементами управления. На элементы управления внутри группового поля не влияет свойство Font формы. Я "решил" это, установив свойство Font в SystemFonts.DialogFont для каждого группового окна.


элементы управления внутри группового поля действительно не зависят от свойства шрифта формы. Причина в том, что элементы управления в элементах управления контейнера рассматриваются как дочерние элементы управления контейнера, такие как groupbox, но не дочерние элементы основной формы. Для правильного масштабирования всех элементов управления, включая элементы в groupboxes, вы можете использовать код, подобный приведенному ниже:

        foreach (Control ctr in this.Controls)
        {
            ctr.Font = SystemFonts.IconTitleFont;

            // controls in groupboxes are not child of main form
            if (ctr.HasChildren)
            {
                foreach (Control childControl in ctr.Controls)
                {
                    childControl.Font = SystemFonts.IconTitleFont;
                }
            }        
        }

попробуйте это, Нажмите форму и измените размер шрифта, например, я изменил размер шрифта формы на 12pt, а затем проверьте, перетащив текстовое поле в форму. Вы увидите, что размер текстового поля также изменен на 12pt. Я получил это решение случайно.


на Control.DefaultFont только для чтения; один хакер должен был перезаписать его, чтобы использовать отражение.

Type settingsType = typeof(Control);
var defaultFontField = settingsType.GetField("defaultFont", BindingFlags.Static | BindingFlags.NonPublic);
defaultFontField.SetValue(null, new Font("Segoe UI", 8.25F));

обязательно имейте UT, следящий за этим кодом, нет контракта API, чтобы защитить вас, если реализация платформы изменится.

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