2

我在我的应用程序中使用表单字体大小正确缩放控件时遇到了一些麻烦。问题在于表单会动态添加控件以响应用户操作。最初设置字体大小时表单上的任何控件都可以完美缩放,但后来添加的控件存在问题。它们的字体可以正确缩放,但它们的位置和大小却没有。要查看实际情况,请创建一个带有空表单的简单项目并粘贴以下代码:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        SplitContainer split = new SplitContainer();
        split.Dock = DockStyle.Fill;
        this.Controls.Add(split);

        // Group 1
        split.Panel1.Controls.Add(NewGroup());

        this.Font = new Font(this.Font.FontFamily, this.Font.Size * 2);

        // Group 2
        split.Panel2.Controls.Add(NewGroup());

        split.SplitterDistance = this.Width / 2;
    }

    public GroupBox NewGroup()
    {
        GroupBox groupBox = new GroupBox();
        groupBox.Size = new System.Drawing.Size(132, 92);
        groupBox.Text = "groupBox";
        groupBox.SuspendLayout();

        Label label = new Label();
        label.AutoSize = true;
        label.Location = new Point(6, 16);
        label.Text = "label";
        groupBox.Controls.Add(label);

        Button button = new Button();
        button.Location = new Point(6, 58);
        button.Size = new Size(93, 28);
        button.Text = "button";
        groupBox.Controls.Add(button);

        CheckBox checkBox = new CheckBox();
        checkBox.AutoSize = true;
        checkBox.Location = new Point(47, 16);
        checkBox.Text = "checkBox";
        groupBox.Controls.Add(checkBox);

        TextBox textBox = new TextBox();
        textBox.Location = new Point(6, 34);
        textBox.Size = new Size(120, 20);
        textBox.Text = "text";
        groupBox.Controls.Add(textBox);

        groupBox.ResumeLayout();

        return groupBox;
    }
}

您可以在添加的第二个 groupbox 中看到我正在谈论的效果。在初始大小更改以正确缩放后,我该怎么做才能添加控件?

更新

如果我将第二个NewGroup调用更改为如下所示:

        GroupBox group = NewGroup();
        split.Panel2.Controls.Add(group);
        group.Scale(new SizeF(2.0f, 2.0f));

结果几乎是正确的。在很多情况下,它往往会偏离一两个像素,并且在复杂的形式中,这开始变得更加明显。我真的需要控件之间的缩放尽可能一致,所以我想避免这种方法。

4

2 回答 2

9

问题是,对 AutoScaleMode=AutoScaleMode.Font 的调用必须在所有控件都放置在表单上之后进行。您在设置 AutoScaleMode 后放置的所有控件都将从自动缩放中忽略。通常,设计器将自动缩放模式的设置放入 InitializeComponents()-Method 中,因此您在 InitializeComponents()-Method 之后创建的每个控件都属于忽略类别。只需从 InitializeComponents()-Method 中删除该行并在表单构造函数的末尾替换它。

(即使问题很老,答案也可能对其他人有所帮助)

于 2012-03-26T12:53:02.997 回答
0

我认为您应该这样做 - 使用 Graphics.DpiX 和 Graphics.DpiY 获取当前 dpi,然后将其除以您的默认 dpi(通常为 96),并为您动态添加的不出现的控件乘以位置和大小值对这个比例。

于 2013-10-30T14:06:19.710 回答