我用C# Form做了一个项目FormBorderStyle=FormBorderStyle.None分辨率= 1920 x 1080。但是,这个项目只设置为1080p,并以720p将其移出屏幕。我如何编写此表单(包括内部组件),以便它适合任何屏幕?如果它需要增长,它会增长,如果它需要缩小,它会缩小,但所有组件也应该相应地移动,因此它们在表单上始终可见。正如我所说,我在项目中不使用边框。
FormBorderStyle=FormBorderStyle.None
gfttwv5a1#
你首先要知道你的屏幕的分辨率是多少。如果你有多个屏幕,默认情况下Form会出现在主屏幕上,也就是Screen.PrimaryScreen。它有两个你需要的属性:Bounds.Width和Bounds.Height。有了这些,你可以改变ClientSize以适应你的屏幕。
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) ); }
首先需要计算屏幕尺寸的ratio到原始的Form尺寸,您设计的布局。分母可能只是表示为数字,因为您只需要定义一次。
double xShift = screenWidth / 816; double yShift = screenHeight / 489;
然后这些可以用作缩放Form上所有控件的因子。要在foreach循环中重新缩放Location和Size属性,我建议定义一个单独的方法:
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对象)不受影响。因此,您可以像这样使用recursive call:
GroupBox
TabControl
if (control.HasChildren) { ScaleLayout(control); }
要调用此方法,只需执行以下操作:
ScaleLayout(this);
1条答案
按热度按时间gfttwv5a1#
你首先要知道你的屏幕的分辨率是多少。如果你有多个屏幕,默认情况下
Form
会出现在主屏幕上,也就是Screen.PrimaryScreen
。它有两个你需要的属性:
Bounds.Width
和Bounds.Height
。有了这些,你可以改变ClientSize
以适应你的屏幕。同时缩放组件
首先需要计算屏幕尺寸的ratio到原始的
Form
尺寸,您设计的布局。分母可能只是表示为数字,因为您只需要定义一次。然后这些可以用作缩放
Form
上所有控件的因子。要在foreach
循环中重新缩放Location
和Size
属性,我建议定义一个单独的方法:这个函数接受一个参数是有原因的;容器控件内部的控件(如
GroupBox
或TabControl
对象)不受影响。因此,您可以像这样使用recursive call:要调用此方法,只需执行以下操作: