Winform 控件随窗体大小改变而变化

来源:互联网 发布:linux怎么创建文件 编辑:程序博客网 时间:2024/05/16 11:18

有如下3种方法:

方法1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace MarkPrinter
{
     public partial class ResizeTest : Form
     {
         public float X;
         public float Y;
         public float y;

         public ResizeTest()
         {
             InitializeComponent();
         }

         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)
             {

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

         }

         void Form1_Resize(object sender, EventArgs e)
         {
             float newx = (this.Width) / X;
             float newy = this.Height / Y;
             setControls(newx, newy, this);
         }

         private void ResizeTest_Load(object sender, EventArgs e)
         {
             this.Resize += new EventHandler(Form1_Resize);

             X = this.Width;
             Y = this.Height;
             y = this.statusStrip1.Height;
             setTag(this);
         }
     }
}

方法2

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace MarkPrinter
{
     public partial class ResizeTest : Form
     {
         public float X;
         public float Y;
         public float y;

         public ResizeTest()
         {
             InitializeComponent();
         }

         private void ResizeTest_Load(object sender, EventArgs e)
         {
             AutoScale(this);
         }

         /// <summary>
         /// 控件随窗体自动缩放
         /// </summary>
         /// <param name="frm"></param>
         public static void AutoScale(Form frm)
         {
             frm.Tag = frm.Width.ToString() + "," + frm.Height.ToString();
             frm.SizeChanged += new EventHandler(frm_SizeChanged);
         }

         static void frm_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));

             }
         }
     }
}

用此方法时,如果界面一开始就要求最大化,在最大化之前就要调用AutoScale方法

方法3

将控件放进容器中, 然后使用控件的Dock属性来获取或设置控件停靠到父容器的哪一个边缘。(略)

 

总结:上面方法的原理,就是先算出来缩放的比例,然后在按照同样的比例对form中的控件进行缩放。