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);
}
}

浙公网安备 33010602011771号