自己写了个类,可以实现窗口大小发生改变时,窗口内的控件大小也随之改变(等比例),
不过调用要有点小技巧,后面再说,类的代码如
/// <summary> /// 窗口控件大小变化随窗口等比变化 /// </summary> public class MyResize { /// <summary> /// 记录改变前窗口的大小 /// </summary> Size originalSize; /// <summary> /// 记录改变前窗口的大小 /// </summary> public Size OriginalSize { get => originalSize; set => originalSize = value; } /// <summary> /// 在水平方向上的比例 /// </summary> float Xratio = 1; /// <summary> /// 在垂直方向上的比例 /// </summary> float Yratio = 1; /// <summary> /// MyResize类实例化 /// </summary> public MyResize(Form f) { OriginalSize = f.Size; } private MyResize() { ///不允许无参构造 } /// <summary> /// 根据窗口大小,自动调整控件大小,不支持容器的子控件! /// </summary> /// <param name="f1">要调整的窗口</param> /// <returns></returns> public void Resize(Form f1) { Xratio = (float)f1.Size.Width / (float)originalSize.Width; Yratio = (float)f1.Size.Height / (float)originalSize.Height; foreach (Control a in f1.Controls) { a.Size = new Size((int)(a.Size.Width * Xratio), (int)(a.Size.Height * Yratio)); a.Location = new Point((int)(a.Location.X * Xratio), (int)(a.Location.Y * Yratio)); } originalSize = f1.Size; }调用的话,声明应该要声明全局的,但实例化要在函数内,一般可以在构造函数中,也可以在窗口的Load事件中都行,但声明的时候不能直接实例化(当然,如果你能在方法外使用this关键字的话可能就可以),下面是一个调用的例子:
TP:为了方便使用,我将它弄成了类库(虽然只是有个类 — . —)。