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

  

  

posted @ 2023-08-16 18:12  [春风十里]  阅读(910)  评论(0编辑  收藏  举报