按照比例缩放窗体控件及字体,如需等比例缩放,只需将x,y的比例设置成相同即可。
为了减小误差,建议使用原始尺寸来计算比例。
1 private float X, Y;
2
3 private bool b = false;
4
5 public MainForm()
6 {
7 InitializeComponent();
8
9 X = this.Width;
10 Y = this.Height;
11
12 SetTag(this);
13
14 b = true;
15 }
16
17 protected override void OnSizeChanged(EventArgs e)
18 {
19 if (!b) return;
20
21 float newx = (this.Width) / X;
22 float newy = this.Height / Y;
23 SetControls(newx, newx, this);
24
25 base.OnSizeChanged(e);
26 }
27
28 /// <summary>
29 /// 存储原始控件参数
30 /// </summary>
31 /// <param name="cons"></param>
32 private void SetTag(Control cons)
33 {
34 foreach (Control con in cons.Controls)
35 {
36 con.Tag = con.Width + ":" + con.Height + ":" + con.Left + ":" + con.Top + ":" + con.Font.Size;
37 if (con.Controls.Count > 0)
38 SetTag(con);
39 }
40 }
41
42 /// <summary>
43 /// 按照比例缩放控件大小及字体
44 /// </summary>
45 /// <param name="newx"></param>
46 /// <param name="newy"></param>
47 /// <param name="cons"></param>
48 private void SetControls(float newx, float newy, Control cons)
49 {
50 foreach (Control con in cons.Controls)
51 {
52 string[] mytag = con.Tag.ToString().Split(new char[] { ':' });
53 int width = (int)(Convert.ToSingle(mytag[0]) * newx);
54 int height = (int)(Convert.ToSingle(mytag[1]) * newy);
55 int x = (int)(Convert.ToSingle(mytag[2]) * newx);
56 int y = (int)(Convert.ToSingle(mytag[3]) * newy);
57 con.Location = new Point(x, y);
58 con.Size = new System.Drawing.Size(width, height);
59 Single currentSize = Convert.ToSingle(mytag[4]) * newy;
60 con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit);
61
62 if (con.Controls.Count > 0)
63 {
64 SetControls(newx, newy, con);
65 }
66 }
67 }
代码