2010-02-19 2 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

I는 다음과 같이 두 번째 NewGroup 전화를 변경하는 경우 :

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

결과 거의 정확합니다. 그것은 많은 경우에 픽셀 또는 2에 의해 떨어져 경향이 있으며, 복잡한 형태로 이것은 훨씬 더 가시적으로 나타나기 시작합니다. 컨트롤 사이에 최대한 일관성있게 스케일링이 필요하므로이 접근법을 피하고 싶습니다.

+0

이러한 문제도 발생합니다. – Eric

답변

7

AutoScaleMode = AutoScaleMode.Font 에 대한 호출은 양식에 모든 컨트롤을 배치 한 후에해야합니다. AutoScaleMode를 설정 한 후에 배치하는 모든 컨트롤은 자동 크기 조절에서 무시됩니다. 일반적으로 Designer는 autoscalemode의 설정을 InitializeComponents() - Method에 배치하므로 InitializeComponents() - Method 이후에 만드는 모든 컨트롤이 무시 된 범주에 속합니다. 그냥 InitializeComponents() - 메서드에서 줄을 제거하고 양식 생성자의 끝에 그것을 바꿉니다.

(심지어 문제는 오래된 대답은 다른 사람을 도울 수)

0

나는이 작업을 수행해야한다고 생각 - (다음, 현재 dpi의를 얻을 수 Graphics.DpiX 및 Graphics.DpiY을 사용하여 기본 dpi로로 분할 일반적으로 96입니다.)이 비율로 올바르게 표시되지 않는 동적으로 추가 된 컨트롤의 위치 및 크기 값을 곱하십시오.