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;
    }
}

私が話している効果は、追加された 2 番目のグループボックスで確認できます。最初のサイズ変更後にコントロールを追加して正しくスケーリングするにはどうすればよいですか?

アップデート

NewGroup2 番目の呼び出しを次のように変更すると:

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

結果はほぼ正しいです。多くの場合、1 ピクセルか 2 ピクセルずれている傾向があり、複雑な形状では、これがより顕著に現れ始めます。コントロール間で可能な限り一貫したスケーリングが必要なので、このアプローチは避けたいと思います。

4

2 に答える 2

9

問題は、AutoScaleMode=AutoScaleMode.Font への呼び出しが、すべてのコントロールがフォームに配置された後に行われる必要があることです。AutoScaleMode を設定した後に配置したすべてのコントロールは、自動スケーリングから無視されます。通常、デザイナーは autoscalemode の設定を InitializeComponents() メソッドに配置するため、InitializeComponents() メソッドの後に作成するすべてのコントロールは、無視されたカテゴリに分類されます。InitializeComponents()-Method から行を削除し、フォーム コンストラクターの最後に置き換えます。

(質問が古くても、答えは他の人を助けるかもしれません)

于 2012-03-26T12:53:02.997 に答える