更改应用程序中所有控件的字体大小(win 表单)

Posted

技术标签:

【中文标题】更改应用程序中所有控件的字体大小(win 表单)【英文标题】:Change the font size of all controls in the application (win forms) 【发布时间】:2018-01-07 15:21:32 【问题描述】:

我有一个应用程序需要适应一系列不同的屏幕尺寸(分辨率)。 我使用表格布局面板完成了大部分工作。

但是一些控件(主要是按钮和标签)字体太大,文本不适合控件。 到目前为止,我已经设法通过使用来更改某些控件的字体

            if (Screen.PrimaryScreen.Bounds.Width < 1440)
        
            button_5.Font = new Font("Impact", button_5.Font.Size - 4);
        

但是对于应用程序中的每个控件来说,添加的文本太多了。

有没有办法一次更改应用程序上所有控件的字体? 或者至少是表单上的所有控件?

【问题讨论】:

每个表单都是一个控件容器,其中的 Controls 属性列出了该表单上的所有控件。当控件本身是控件容器(面板、组框)时,它具有一个控件集合,其中包含由该容器托管的控件。构建一个循环遍历表单所有控件的递归函数相对容易 你能给我一个这样的函数的例子,这样我就可以构建我需要的东西了吗? 我已经设法通过使用 foreach (Control ctrl in tableLayoutPanel1.Controls) ctrl.Font = new Font("Impact", ctrl.字体大小 - 4);但还不知道如何访问整个表单的所有控件。 【参考方案1】:

一个简单的递归函数将遍历表单中的所有控件并更改字体大小。您需要针对您的控件对其进行测试并查看效果,因为在此代码中没有异常处理

public void SetAllControlsFont(ControlCollection ctrls)

    foreach(Control ctrl in ctrls)
    
        if(ctrl.Controls != null)
            SetAllControlsFont(ctrl.Controls);

        ctrl.Font = new Font("Impact", ctrl.Font.Size - 4);

    

您可以通过初始表单的控件集合从顶层表单调用它

SetAllControlsFont(this.Controls);

【讨论】:

这只会更改第一个表格布局面板的字体,但不会循环遍历其余控件。 如果 this.Controls 是 Form.Controls 集合,则不应如此。层次结构的顶层 这是否与this.Controls 仅包含System.Windows.Forms.TableLayoutPanel, BorderStyle: System.Windows.Forms.BorderStyle.None 的事实有关,这甚至不是表单上的实际控件,而只是控件的类型。 我设法通过将public void SetAllControlsFont(ControlCollection ctrls) 更改为public void SetAllControlsFont(Control.ControlCollection ctrls) 来使其工作,而不是this.Controls,我给了它tableLayoutPanel1.Controls,其中包含所有其他表格布局面板。现在它遍历所有面板和这些面板内的所有控件。 问题是 SetAllControlsFont(ctrl.Controls); 无法从 Cntrol.ControlCollection 转换为 Form.ControlCollection。显然,这些是不同的控件集合类型。【参考方案2】:

基于Steve's好的答案,我会做以下改进:

/// <summary>
/// Changes fonts of controls contained in font collection recursively. <br/>
/// <b>Usage:</b> <c><br/>
/// SetAllControlsFont(this.Controls, 20); // This makes fonts 20% bigger. <br/>
/// SetAllControlsFont(this.Controls, -4, false); // This makes fonts smaller by 4.</c>
/// </summary>
/// <param name="ctrls">Control collection containing controls</param>
/// <param name="amount">Amount to change: posive value makes it bigger, 
/// negative value smaller</param>
/// <param name="amountInPercent">True - grow / shrink in percent, 
/// False - grow / shrink absolute</param>
public static void SetAllControlsFontSize(
                   System.Windows.Forms.Control.ControlCollection ctrls,
                   int amount = 0, bool amountInPercent = true)

    if (amount == 0) return;
    foreach (Control ctrl in ctrls)
    
        // recursive
        if (ctrl.Controls != null) SetAllControlsFontSize(ctrl.Controls,
                                                          amount, amountInPercent);
        if (ctrl != null)
        
            var oldSize = ctrl.Font.Size;
            float newSize = 
               (amountInPercent) ? oldSize + oldSize * (amount / 100) : oldSize + amount;
            if (newSize < 4) newSize = 4; // don't allow less than 4
            var fontFamilyName = ctrl.Font.FontFamily.Name;
            ctrl.Font = new Font(fontFamilyName, newSize);
        ;
    ;

这允许放大或缩小字体大小以百分比,例如:

SetAllControlsFont(this.Controls, 20); 

或者您可以绝对将字体大小缩小 -4 值,例如:

SetAllControlsFont(this.Controls, amount: -4, amountInPercent: false); 

在这两个示例中,所有字体都会受到更改的影响。您不需要知道字体系列名称,每个控件可以有不同的。

结合this answer 您可以在您的应用程序中根据 Windows 设置自动缩放字体(您可以在桌面上右键单击找到,然后选择显示设置、缩放和布局,然后修改值“更改文本、应用程序和其他项目的大小” - 在比 build 1809 更新的 Windows 10 版本中,这被(重新)命名为 "Make everything bigger"):

var percentage = GetWindowsScaling() - 100;
SetAllControlsFont(this.Controls, percentage); 

您还应该根据您的表单布局将大小限制为某个最大值/最小值,例如

if (percentage > 80)  percentage = 80;
if (percentage < -20) percentage = -20;

同样,对于绝对值也是如此 - 请注意,在代码中已经设置了一个限制:实际上,字体不能小于 4 em - 这被设置为最小限制(当然您可以根据您的需要进行调整)。

【讨论】:

以上是关于更改应用程序中所有控件的字体大小(win 表单)的主要内容,如果未能解决你的问题,请参考以下文章

delphi 2010 richedit控件字体问题!

Windows Forms C# 应用程序 - 当用户为操作系统字体大小选择 125% 或 150% 时,设置表单控件的字体大小以适应屏幕?

整个项目的字体一致性?

win10安装的chrome字体显示模糊该怎么弄

MFC 请教怎样设置STATIC TEXT控件的字体大小和颜色

MFC 请教怎样设置STATIC TEXT控件的字体大小和颜色