2010-02-19 12 views
2

J'ai eu quelques problèmes de mise à l'échelle des contrôles dans mon application correctement avec la taille de police du formulaire. Le problème est que le formulaire ajoute dynamiquement des contrôles en réponse aux actions de l'utilisateur. Tous les contrôles qui se trouvent sur le formulaire lorsque la taille de la police est initialement définie s'équilibrent parfaitement, mais ceux qui sont ajoutés par la suite présentent des problèmes. Leur police est correctement mise à l'échelle, mais pas leur position ni leur taille. Pour voir en action, créer un projet simple avec une forme vide et coller dans le code suivant:Contrôles AutoScaleMode.Font et ajoutés dynamiquement

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

Vous pouvez voir l'effet que je parle dans le deuxième groupbox ajouté. Que puis-je faire pour ajouter des contrôles après le changement de taille initial à l'échelle correctement?

MISE À JOUR

Si je change la deuxième NewGroup appel à ressembler à ceci:

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

Le résultat est presque correct. Dans de nombreux cas, il a tendance à être décalé d'un pixel ou deux, et dans des formes complexes, cela commence à apparaître beaucoup plus visiblement. J'ai vraiment besoin de la mise à l'échelle pour être aussi cohérente que possible entre les contrôles, donc je voudrais éviter cette approche.

+0

J'ai aussi ces problèmes. – Eric

Répondre

7

Le problème est, que l'appel à AutoScaleMode = AutoScaleMode.Font doit venir après que tous les contrôles ont été placés sur le formulaire. Toutes les commandes que vous placez après le réglage du mode AutoScaleMode sont ignorées de l'autoscaling. Généralement, le concepteur place le paramètre du paramètre autoscalemode dans la méthode InitializeComponents(), de sorte que tous les contrôles que vous créez après la méthode InitializeComponents() tombent dans la catégorie ignored. Supprimez simplement la ligne de la méthode InitializeComponents() et remplacez-la à la fin du constructeur de votre formulaire.

(même la question est ancienne, la réponse peut aider les autres)

0

Je pense que vous devriez le faire - utiliser Graphics.DpiX et Graphics.DpiY pour obtenir dpi courant, puis partager avec votre dpi par défaut (Habituellement, il s'agit de 96) et multipliez les valeurs de position et de taille de vos contrôles ajoutés dynamiquement qui n'apparaissent pas correctement avec ce ratio.