2008-11-18 4 views
34

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

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

ответ

14

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

11

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

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

+0

Это действительно печально. :( – wasker 2008-11-19 00:53:59

30

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

this.Font = SystemFonts.MessageBoxFont; 

Это, по всей видимости работать с Windows XP и Windows Vista.

+0

Да, это работа, которую я обычно использую. – Lucas 2009-02-01 18:14:58

1

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

41

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

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

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

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

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

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

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

+0

Вы заметили, что в 2008 году был задан вопрос? Ответ довольно поздний – 2015-07-08 18:50:45

1

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

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

Обязательно иметь УТ следить за этим кодом, нет никакого контракта API, чтобы защитить вас в случае изменения реализации Framework.

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

Смежные вопросы