如何在分辨率改变时自动调整窗体控件的大小和位置

54

我注意到有些应用程序会更改其控件的位置,以使自己尽可能地适应当前的分辨率。例如,如果窗口最大化,控件被设置在一种方式,使得整体GUI看起来平衡。

在Visual Studio 2010中使用C#是否可以实现这个功能?

10个回答

73

使用DockAnchor属性。这篇文章很好地解释了如何使用这两个属性进行控件布局。请注意,这些属性可以处理最大化/最小化的情况,但如果屏幕分辨率发生变化,则会有所不同,但思路是相同的。


我必须提到AutoScaleMode,它让我在使用Anchor&Dock的游戏上浪费了很多时间(实际上并不是问题的根源...) - ephraim

27

使用以下组合来得到所需的结果:

  1. Anchor属性设置为None,控件不会被调整大小,只会移动其位置。

  2. Anchor属性设置为Top+Bottom+Left+Right,控件将被调整大小,但它们的位置不会改变。

  3. 将窗体的Minimum Size属性设置为适当的值。

  4. 设置Dock属性。

  5. 使用Form Resize事件来更改任何想要的内容。

我不知道字体大小(标签、文本框、组合框等)在1-4中会有何影响,但可以在5中进行控制。


12
float widthRatio = Screen.PrimaryScreen.Bounds.Width / 1280;
float heightRatio = Screen.PrimaryScreen.Bounds.Height / 800f;
SizeF scale = new SizeF(widthRatio, heightRatio);
this.Scale(scale);
foreach (Control control in this.Controls)
{
control.Font = new Font("Verdana", control.Font.SizeInPoints * heightRatio * widthRatio);
}

@AfnanBashir 或许是这样,但如果你已经有一个拥有大量控件的 Windows 表单,那么这个可以为你节省大量时间。+1 - user1704812
这是一个有趣的做法(即使比率计算可以改进)。表面上,它依赖于窗体的“Font”属性的“AutoScaleMode”。 - Zeus

2

1
抱歉,我晚了看到问题, 这是一个在程序上很容易实现的解决方案,对我很有效,
创建这些全局变量:
 float firstWidth;
 float firstHeight;

在加载后,填充这些变量;
 firstWidth = this.Size.Width;
 firstHeight = this.Size.Height;

然后选择您的表单并将这些代码放入表单的SizeChange事件中;

 private void AnaMenu_SizeChanged(object sender, EventArgs e)
    {
        

        float size1 = this.Size.Width /  firstWidth;
        float size2 = this.Size.Height / firstHeight;

            SizeF scale = new SizeF(size1, size2);
        firstWidth = this.Size.Width;
        firstHeight = this.Size.Height;

        foreach (Control control in this.Controls)
        {
                
            control.Font = new Font(control.Font.FontFamily, control.Font.Size* ((size1+ size2)/2));
            
            control.Scale(scale);
                

        }


    }

我希望这能有所帮助,在我的项目中它运行得非常完美。


在使用您的代码后,我在以下行中收到错误消息:“Value of '∞' is not valid for 'emSize'. 'emSize' should be greater than 0 and less than or equal to System.Single.MaxValue. Parameter name: emSize”,该行为“control.Font = new Font(control.Font.FontFamily, control.Font.Size* ((size1+ size2)/2));”。 - Bumba

0

-1
将此代码添加到页面加载中,适用于所有控件或将所有控件添加到容器中。
int x;
Point pt = new Point();
x = Screen.PrimaryScreen.WorkingArea.Width - 1024;
x = x / 2;
pt.Y = groupBox1.Location.Y + 50;
pt.X = groupBox1.Location.X + x;
groupBox1.Location = pt;

-2
在窗体加载事件中添加这行代码。
this.WindowState = FormWindowState.Maximized;

-3
private void MainForm_Load( object sender, EventArgs e ) 
     { 
        this.Size = Screen.PrimaryScreen.WorkingArea.Size 
     }

-6
this.WindowState = FormWindowState.Maximized;

4
欢迎来到Stack Overflow!虽然这段代码可能回答了问题,但如果提供关于为什么和/或如何回答问题的额外上下文信息,可以增加它的长期价值。 - ryanyuyu
3
这段代码只能让你的窗口最大化,但窗口内所有控件的大小不会自动改变。 - Vincent Elbert Budiman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接