winforms 如何在C#中设置每个屏幕的窗体分辨率?

e7arh2l6  于 2023-04-21  发布在  C#
关注(0)|答案(1)|浏览(332)

我用C# Form做了一个项目
FormBorderStyle=FormBorderStyle.None
分辨率= 1920 x 1080。
但是,这个项目只设置为1080p,并以720p将其移出屏幕。我如何编写此表单(包括内部组件),以便它适合任何屏幕?如果它需要增长,它会增长,如果它需要缩小,它会缩小,但所有组件也应该相应地移动,因此它们在表单上始终可见。
正如我所说,我在项目中不使用边框。

gfttwv5a

gfttwv5a1#

你首先要知道你的屏幕的分辨率是多少。如果你有多个屏幕,默认情况下Form会出现在主屏幕上,也就是Screen.PrimaryScreen
它有两个你需要的属性:Bounds.WidthBounds.Height。有了这些,你可以改变ClientSize以适应你的屏幕。

private double screenWidth = Screen.PrimaryScreen.Bounds.Width;
private double screenHeight = Screen.PrimaryScreen.Bounds.Height;
private void FitWindowFormToScreen() {
     this.ClientSize = new Size
     (   Convert.ToInt32(screenWidth),
         Convert.ToInt32(screenHeight)
     );
}

同时缩放组件

首先需要计算屏幕尺寸的ratio到原始的Form尺寸,您设计的布局。分母可能只是表示为数字,因为您只需要定义一次。

double xShift = screenWidth / 816;
double yShift = screenHeight / 489;

然后这些可以用作缩放Form上所有控件的因子。要在foreach循环中重新缩放LocationSize属性,我建议定义一个单独的方法:

private void ScaleLayout(Control container) {
    foreach (Control control in container.Controls) {
        control.Location = new Point
        (   Convert.ToInt32(control.Location.X * xShift),
            Convert.ToInt32(control.Location.Y * yShift)
        );
        control.Size = new Size
        (   Convert.ToInt32(control.Size.Width * xShift),
            Convert.ToInt32(control.Size.Height * yShift)
        );
    }
}

这个函数接受一个参数是有原因的;容器控件内部的控件(如GroupBoxTabControl对象)不受影响。因此,您可以像这样使用recursive call

if (control.HasChildren) {
    ScaleLayout(control);
}

要调用此方法,只需执行以下操作:

ScaleLayout(this);

相关问题