C#窗体缩放时窗体上控件大小自动按同比例变化功能封装
C#程序写完后,如果窗体的MaximumSize和MinimumSize的值未设置和当前窗体的Size一致大小,
那么窗体大小可调,但此时窗体控件大小和位置仍然保持不变,此时界面就不是我们所希望的了,基
于此,我查找学习了有关窗体缩放的代码,并分享给大家。
我将此功能简单处理,方便多个窗体使用,减少代码的重复
##1.封装
using System;
using System.Drawing;
using System.Windows.Forms;
class ClassScale{
//X、Y是保存初始窗体的 Width Height
public float X;
public float Y;
//flag是初始化X、Y的标识
public static bool flag=true;
public Size size { get; set; }
public Control cons { get; set; }
public void InitXY(Size s)
{
X = s.Width;
Y = s.Height;
}
//setTag方法是将窗体上所有子控件的宽度、高度、左边距、顶部距离及字体大小暂存起来
//con.Width con.Height con.Left con.Top con.Font.Size
public 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);
}
}
//通过缩放比例,改变窗体上所有子控件的宽度、高度、左边距、顶部距离及字体大小的信息
public void setControls(float newx, float newy, Control cons)
{
foreach (Control con in cons.Controls)
{
string[] mytag = con.Tag.ToString().Split(new char[] { ':' });
float a = Convert.ToSingle(mytag[0]) * newx;
con.Width = (int)a;
a = Convert.ToSingle(mytag[1]) * newy;
con.Height = (int)(a);
a = Convert.ToSingle(mytag[2]) * newx;
con.Left = (int)(a);
a = Convert.ToSingle(mytag[3]) * newy;
con.Top = (int)(a);
Single currentSize = Convert.ToSingle(mytag[4]) * Math.Min(newx, newy);
con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit);
if (con.Controls.Count > 0)
{
setControls(newx, newy, con);
}
}
}
//计算缩放的比例
public void Scale_Resize(object sender, EventArgs e)
{
float newx = size.Width / X;
float newy = size.Height / Y;
setControls(newx, newy, cons);
}
//初始化X、Y
//调用setTag() Scale_Resize()方法
public void Scale_Change() {
if (flag) InitXY(size);
flag = false;
setTag(cons);
Scale_Resize(new object(), new EventArgs());
}
}
##2.调用
ClassScale c; //全局变量 c
//窗体的Load事件中添加
private void Form1_Load(object sender, EventArgs e)
{
//获取当前窗体的size 和所有控件
c = new ClassScale() { size = this.Size, cons = this.Controls.Owner };
this.Resize += new EventHandler(c.Scale_Resize); //调整控件大小
c.Scale_Change();
}
//当窗体大小发生变化时,更新c的size
private void Form1_SizeChanged(object sender, EventArgs e)
{
c.size = this.Size;
}