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

为什么会这样?如何确保我的应用程序看起来像普通的Windows应用程序?

有帮助吗?

解决方案

查看此博客文章,讨论表单中的默认字体导致您遇到的问题和此 Connect Bug 与微软的回应。简而言之,似乎Forms没有获得(正确的)默认窗口字体(您已更改)。

其他提示

接受的答案并没有真正回答这个问题;它只是解释了为什么会出现这种情况。

其他一些答案提出了可靠的解决方法,但我发现最好的解决方案是创建一个基本表单,应用程序中的所有表单都从该表单继承并将此基本表单的Font属性设置为SystemFonts.MessageBoxFont in构造函数。这不仅可以确保您的应用程序在运行时根据用户的环境选择正确的字体(排除Hans Passant提出的潜在问题<!>#8212;没有Office 2007的XP将使用Microsoft Sans Serif缺少Segoe UI),但也为您当前的Windows字体提供设计时支持。在设计时使用正确的字体解决了Josuegomes指出的问题,因为在表单上创建的任何容器控件都将在设计时获取表单使用的字体。

除了上述优点之外,这还使您不必记住修改您创建的每个表单的构造函数,并确保应用程序中所有表单的一致性,并为您提供放置其他常用功能的位置。我以几种不同的方式使用它,例如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可用的机器上翻译它。不确定是什么弹出来的,我再也没有这样的机器了。

如果您具有包含关联控件的组框,则将窗体的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;
                }
            }        
        }

试试这个,单击一个表单并更改字体大小,例如我将Form的字体大小更改为12pt,然后通过拖动文本框测试表单。你会看到,文本框大小也改为12pt。我偶然得到了这个解决方案。

Control.DefaultFont是ReadOnly;一个hacky是覆盖它是使用反射。

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

确保让UT密切关注此代码,如果Framework实施发生变化,则没有API合同可以保护您。

还要注意表单设计器,大部分时间都会在.designer类中逐字插入字体。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top