2010-02-19 57 views
2

我一直在使用表单字体大小正确地在应用程序中缩放控件。问题在于表单动态添加控件以响应用户操作。当初始设置字体大小时,窗体上的任何控件均可完美缩放,但之后添加的控件有问题。他们的字体正确缩放,但是他们的位置和大小却没有。要看到这个动作,用一个空的表单创建一个简单的项目,并在下面的代码粘贴:AutoScaleMode.Font和动态添加的控件

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

你可以看到,我在谈论中添加的第二组框的效果。如何在初始大小更改后添加控件以正确缩放?

UPDATE

如果我改变第二NewGroup调用这个样子:

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

结果几乎是正确的。在很多情况下,它往往会被一个像素或两个像素所关闭,而在复杂的形式中,这开始显现得更加明显。我真的需要在控件之间尽可能保持一致,所以我想避免这种方法。

+0

我也有这些问题。 – Eric 2010-05-17 16:30:51

回答

7

问题是,调用 AutoScaleMode = AutoScaleMode.Font 必须在所有控件放在窗体上之后。在设置AutoScaleMode后放置的所有控件都会从自动缩放中忽略。通常,Designer将自动代码段的设置放入InitializeComponents() - Method中,因此您在InitializeComponents() - Method之后创建的每个控件都属于被忽略的类别。只需从InitializeComponents() - Method中删除该行,并将其替换为窗体构造函数的结尾。

(即使问题是旧的,答案可能帮助别人)

0

我认为你应该这样做 - 使用Graphics.DpiX和Graphics.DpiY来获取当前的DPI,然后用您的默认DPI把它(通常它是96),并为您的动态添加的控件乘以位置和大小值,这些值并不正确。