我用c# Form做了一个项目
FormBorderStyle=FormBorderStyle.None
分辨率= 1920x1080。
但是,这个项目只设置为1080p,并在屏幕外以720p显示。如何编写此表单(包括其中的组件),使其适合任何屏幕?如果它需要增长,它就会增长,如果它需要缩小,它就会缩小,但所有组件也应该相应移动,这样它们在表单上总是可见的。
就像我说的,我在我的项目中不使用边框。
您首先必须找出屏幕的分辨率是多少。如果您有多个屏幕,默认情况下Form
将出现在主屏幕上,即Screen.PrimaryScreen
。
这有两个您需要的属性:Bounds.Width
和Bounds.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)
);
}
也可以缩放组件
您首先需要计算屏幕大小与原始Form
大小的比率,您在此设计布局。分母可以只用数字表示,因为只需要定义一次。
double xShift = screenWidth / 816;
double yShift = screenHeight / 489;
这些可以用作Form
上的所有控件的缩放因子。为了在foreach
循环中重新调整Location
和Size
属性,我建议定义一个单独的方法:
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)
);
}
}
这个函数接受形参是有原因的;位于容器控件(如GroupBox
或TabControl
对象)内部的控件不受影响。因此,您可以使用这样的递归调用:
if (control.HasChildren) {
ScaleLayout(control);
}
要调用这个方法,只需:
ScaleLayout(this);