winforms 更改应用程序中所有控件的字体大小(Win窗体)

clj7thdc  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(152)

我有一个应用程序,需要适应一系列不同的屏幕尺寸(分辨率)。我使用表格布局面板完成了大部分工作。
但是一些控件(主要是按钮和标签)的字体太大,文本不适合控件。到目前为止,我已经成功地更改了一些控件的字体

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

但是,对于应用程序中的每个控件来说,要添加太多的文本。
有没有一种方法可以同时更改应用程序中所有控件的字体?或者至少是窗体上的所有控件?

cwdobuhd

cwdobuhd1#

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

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);
xu3bshqb

xu3bshqb2#

基于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);

您还应该根据您的表单布局,将大小限制在一定的最大/最小值。g的。

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

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

相关问题