1. 在主窗体中添加核心代码
#region 控件大小随窗体大小等比例缩放
private readonly float x; //定义当前窗体的宽度
private readonly float y; //定义当前窗体的高度
private void setTag(Control cons)
{
foreach (Control con in cons.Controls)
{
con.Tag = con.Width + ";" + con.Height + ";" + con.Left + ";" + con.Top + ";" + con.Font.Size;
if (con.Controls.Count > 0) setTag(con);
}
}
private void setControls(float newx, float newy, Control cons)
{
//遍历窗体中的控件,重新设置控件的值
foreach (Control con in cons.Controls)
//获取控件的Tag属性值,并分割后存储字符串数组
if (con.Tag != null)
{
var mytag = con.Tag.ToString().Split(';');
//根据窗体缩放的比例确定控件的值
con.Width = Convert.ToInt32(Convert.ToSingle(mytag[0]) * newx); //宽度
con.Height = Convert.ToInt32(Convert.ToSingle(mytag[1]) * newy); //高度
con.Left = Convert.ToInt32(Convert.ToSingle(mytag[2]) * newx); //左边距
con.Top = Convert.ToInt32(Convert.ToSingle(mytag[3]) * newy); //顶边距
var currentSize = Convert.ToSingle(mytag[4]) * newy; //字体大小
if (currentSize > 0) con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit);
con.Focus();
if (con.Controls.Count > 0) setControls(newx, newy, con);
}
}
/// <summary>
/// 重置窗体布局
/// </summary>
private void ReWinformLayout()
{
var newx = Width / x;
var newy = Height / y;
setControls(newx, newy, this);
}
#endregion
2. 在窗体构造函数内初始化适配
public Form1()
{
InitializeComponent();
#region 初始化控件缩放
x = Width;
y = Height;
setTag(this);
#endregion
}
3. 在Resize事件中调用重绘函数
private void Form1_Resize(object sender, EventArgs e)
{
ReWinformLayout();
}
更新…添加另一种自带自适应布局的方法。上面的是要我们自己去计算比例缩放,其实winfrom有自带的.
首先还是要先获取当前窗体的大小,算了直接贴代码。
public Form1() //窗口构造函数不必多说
{
InitializeComponent();
//获取窗口的大小,Tag随便保存的,也可以定义变量保存
this.Tag = this.Width.ToString()+","+this.Height.ToString();
//这一步很重要,不能隐式的去生成这个事件,就是不能直接在属性栏里面双击自动生成,
//因为这个SizeChanged比获取窗口大小提前执行,不然会空引用异常。
//InitializeComponent(),组件初始化,这个必须先执行,会触发SizeChanged,窗体大小
this.SizeChanged += new EventHandler(Form1_SizeChanged);
}
private void Form1_SizeChanged(object sender, EventArgs e)
{
//这一步不必多说
string[] tmp = ((Form)sender).Tag.ToString().Split(',');
//比例因子
float width = (float)((Form)sender).Width / (float)Convert.ToInt16(tmp[0]);
float heigth = (float)((Form)sender).Height / (float)Convert.ToInt16(tmp[1]);
//保存变化后的大小,下一次再根据这个求比例因子
((Form)sender).Tag = ((Form)sender).Width.ToString() + "," + ((Form)sender).Height;
//根据比例因子,重绘所有控件
foreach (Control control in ((Form)sender).Controls)
{
control.Scale(new SizeF(width, heigth));
}
}