C# winform 控件跟随窗口大小缩放

2020年12月23日 Jerry 13278 2021年1月17日

C# Winform 常用来开发桌面程序,不同的电脑有不同的分辨率,需要适应不同的窗体,其中的控件如何根据窗体大小进行缩放呢?

举个例子:

有个程序界面如下:

jerrycoding C# winform 控件跟随窗口大小缩放

运行时,窗口没有最大化的时候,图片基本居中:

jerrycoding C# winform 控件跟随窗口大小缩放

当窗口拉动改变大小或最大化时,图片框并没有随之改变:

jerrycoding C# winform 控件跟随窗口大小缩放

怎么解决这个问题呢??百度了一堆,终于找到个解决办法。

1、给这个项目添加一个类,我这里时MyForm 继承Form,其中整个类代码如下

    public partial class Myform: Form
    {
        private float X, Y;
        //获得控件的长度、宽度、位置、字体大小的数据
        private void setTag(Control cons)//Control类,定义控件的基类
        {
            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)
            {
                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]) * newy;
                con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit);
                if (con.Controls.Count > 0)
                {
                    setControls(newx, newy, con);//递归
                }
            }
        }


        private void MyForm_Resize(object sender, EventArgs e)
        {
            float newx = (this.Width) / X;//当前宽度与变化前宽度之比
            float newy = this.Height / Y;//当前高度与变化前宽度之比
            setControls(newx, newy, this);
            this.Text = this.Width.ToString() + " " + this.Height.ToString();  //窗体标题显示长度和宽度
        }


        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            this.Resize += new EventHandler(MyForm_Resize);
            X = this.Width;
            Y = this.Height;
            setTag(this);
        }
    }

2、使之前的窗体继承这个MyForm即可搞定。

public partial class Form1 : MyForm
{
   public Form1()
   {
       InitializeComponent();
   }
}

效果来个动图

jerrycoding C# winform 控件跟随窗口大小缩放

不过,winform 做界面还是太挫了。有能力还是搞搞 WPF更舒服一些吧。。


原创文章,转载请注明出处: https://jerrycoding.com/article/winform_scale

微信
jerry微信赞助
支付宝
jerry支付宝赞助

您尚未登录,暂时无法评论。请先 登录 或者 注册

0 人参与 | 0 条评论