2010-02-19 85 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),併爲您的動態添加的控件乘以位置和大小值,這些值並不正確。