Winform控件自适应窗体大小
思路[参考他人]:
1>保存窗体的初始宽度和高度;
2>保存窗体内所有控件的初始宽度,初始高度和坐标;
3>窗体的Resize事件触发时,计算新的Size和初始Size的比例prec;
4>遍历窗体内所有控件,将其的Size和坐标乘以prec;
代码:
窗体注册,保存窗体及其所有控件的初始尺寸,编写Resize事件逻辑:
public static void Register(Control con) { SetFlag(con); con.Tag = con.Width + ";" + con.Height + ";" + con.Top + ";" + con.Left; con.Resize += (object sender, EventArgs e) => { Control c = (sender as Control); int initX = Convert.ToInt32(c.Tag.ToString().Split(';')[0]); int initY = Convert.ToInt32(c.Tag.ToString().Split(';')[1]); float x = c.Width / initX; float y = c.Width / initY; ReControlSize(x, y, c); }; }
SetFlag函数:
static void SetFlag(Control con) { foreach (Control c in con.Controls) { c.Tag = c.Width + ";" + c.Height + ";" + c.Top + ";" + c.Left; SetFlag(c); } }
ReControlSize函数:
static void ReControlSize(float x,float y,Control obj) { foreach (Control con in obj.Controls) { if (con.Tag == null) continue; string[] tags = con.Tag.ToString().Split(';'); con.Width = Convert.ToInt32(Convert.ToSingle(tags[0]) * x); con.Height = Convert.ToInt32(Convert.ToSingle(tags[1]) * y); con.Top = Convert.ToInt32(Convert.ToSingle(tags[2]) * y); con.Left = Convert.ToInt32(Convert.ToSingle(tags[3]) * x); ReControlSize(x, y, con); } }