Windows窗体应用程序的默认字体

每当我在应用程序中创build一个新窗体时,默认使用“Microsoft Sans Serif,8.25pt”字体。 我没有改变它,因为我知道在这种情况下,我的表单应该select系统的默认字体。 但是,当我运行我的应用程序时,使用的字体仍然是Segoe UI(我的Windows Vista操作系统中的默认系统字体)。

为什么会这样呢? 我如何确保我的应用程序看起来像一个正常的Windows应用程序?

查看这个博客文章,谈论表单中的默认字体,这会导致您遇到的问题,以及与Microsoft响应的Connect Bug 。 简而言之,Forms似乎没有得到(正确的)默认窗口字体(你已经改变了)。

被接受的答案并不真正回答这个问题。 它只是解释了为什么会发生这种行为。

其他一些答案提出了可靠的解决方法,但是我发现最好的解决scheme确实是创build一个基本窗体,使应用程序中的所有窗体都inheritance并在构造函数中将此基本窗体的Font属性设置为SystemFonts.MessageBoxFont 。 这不仅可以确保您的应用程序在运行时根据用户的环境select正确的字体(标题为Hans Passant提出的潜在问题),没有Office 2007的XP将在没有Segoe UI的情况下使用Microsoft Sans Serif ),而且还为您的当前Windows字体提供devise时支持。 在devise时使用正确的字体解决了Josuegomes指出的问题,因为在表单上创build的任何容器控件将在devise时选取表单使用的字体。

除了上述优点外,这使得您不必记住修改您创build的每个表单的构造函数,并确保您的应用程序中所有表单的一致性,并为您提供放置其他常用function的地方。 我以几种不同的方式使用它,例如p / invoking等,以修复WinForms实现中的错误。

这种方法唯一的问题就是如果你想为一个特定的控件设置一个字体样式,比如粗体。 做这件事的最好的地方仍然是在窗体的构造函数中,从窗体的字体作为基础开始,然后修改它的样式:

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

您可以在Form构造函数中的InitializeComponent()之前添加:

 this.Font = SystemFonts.MessageBoxFont; 

这似乎与Windows XP和Windows Vista一起使用。

是的,它使用GetStockObject(DEFAULT_GUI_FONT)返回的字体。 MS Sans Serif是什么? 一种古老的字体,早已从大多数机器中消失。 字体映射器翻译它,毫不奇怪,微软Sans Serif。

我不知道如何更改默认字体,SDK文档中明确提到了MS Sans Serif。 如果你想要Segoe,你必须要求。 这不是安全的做法,在没有Office 2007的情况下仍然有许多XP机器。字体映射器将在没有Segoe的机器上翻译它。 不知道popup什么,我没有这样的机器了。

将窗体的Font属性设置为SystemFonts.DialogFont不起作用,如果您有关联控件的组框。 组框中的控件不受窗体的Font属性的影响。 我“解决”了这一点,通过将字体属性设置为SystemFonts.DialogFont为每个combobox。

组框中的控件确实不受窗体的Font属性的影响。 原因是容器控件中的控件被视为容器控件(如groupbox)的子项,而不是主窗体的子项。 为了使包括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; } } } 

试试这个,点击一个表格,改变字体大小,例如我把Form的字体大小改为12pt,然后通过拖动文本框来testingForm。 你会看到,文本框的大小也改变为12pt。 我刚刚得到这个解决scheme,意外。

Control.DefaultFont是ReadOnly; 一个哈克是覆盖它是使用reflection。

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

确保有一个UT关注这个代码,如果框架实现改变,没有API合约来保护你。

也要注意表单devise器,大多数时候会将字体逐字地插入.designer类中。