Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

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

В некоторых других ответах предлагаются надежные обходные пути, но я обнаружил, что лучшее решение на самом деле - создать базовую форму, от которой наследуются все формы в вашем приложении, и установить для свойства 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)

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

this.Font = SystemFonts.MessageBoxFont;

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

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

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

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

На элементы управления внутри группового поля действительно не влияет свойство 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;
                }
            }        
        }

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top