Шрифт по умолчанию для приложения Windows Forms - PullRequest
36 голосов
/ 18 ноября 2008

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

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

Ответы [ 8 ]

42 голосов
/ 02 ноября 2010

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

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

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

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

myControl.Font = New Font(Me.Font, FontStyle.Bold)
30 голосов
/ 20 января 2009

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

this.Font = SystemFonts.MessageBoxFont;

Это похоже на работу с Windows XP и Windows Vista.

14 голосов
/ 24 ноября 2008

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

11 голосов
/ 18 ноября 2008

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

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

1 голос
/ 18 ноября 2015

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, который защитил бы вас в случае изменения реализации Framework.

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

1 голос
/ 08 июля 2015

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

1 голос
/ 21 октября 2011

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

        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;
                }
            }        
        }
1 голос
/ 02 сентября 2009

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

...