C#窗体缩放时窗体上控件同缩放比例变化

2019/10/31 15:40
阅读数 396

https://www.cnblogs.com/sakalaka/p/5135230.html 及 https://blog.csdn.net/qq_36526650/article/details/78442382

编写完程序后,运行时发现窗体放大后控件保持原来的属性,很丑,哈哈哈~~~从网上搜索如何控件与窗体同比例缩放,很庆幸,一下子找到第二个链接,然后进第一个链接学习到了,简单易懂。下方的是防止自己忘记又需要重新理解的笔记。

1. 定义2个全局float 变量X,Y,用来记录窗体默认窗口时的宽度和高度。

  float X;  //默认窗口的宽度

  float Y;  //默认窗口的高度

2. 窗体Load的时候将窗体的宽度、高度赋值给X、Y。

  private void Form1_Load(object sender, EventArgs e)

  {

    X = this.Width;   //将窗体的宽度赋值给X
         Y = this.Height;   //将窗体的高度赋值给Y

    setTag(this);   //调用setTag函数(下一步介绍)

  }

3. 窗体Load的时候调用setTag函数(第2步最后的语句)将窗体上所有子控件的宽度、高度、左边距、顶部距离及字体大小暂存起来。

  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);   //如果此控件存在子控件,则此控件的子控件执行此函数一次
            }

  }

4. 窗体缩放时,计算出相应的缩放比例,然后通过缩放比例参数调用setControls函数,改变窗体上所有子控件的宽度、高度、左边距、顶部距离及字体大小的信息。

  4.1 计算缩放比例

  private void Form1_Resize(object sender, EventArgs e)

  {

    float newx= (this.Width) / X;   //窗体宽度缩放比例

    float newy= (this.Height) / Y;   //窗体高度缩放比例

    setControls(newx, newy, this);   //调用setControls函数(下一小步介绍)

  }

  4.2 通过缩放比例,改变窗体上所有子控件的宽度、高度、左边距、顶部距离及字体大小的信息。

  private void setControls(float newx, float newy, Control cons)

  {

    foreach (Control con in cons.Controls)

    {
                  string[] myTag = con.Tag.ToString().Split(':');     //将con的宽、高、左边距、顶边距离及字体大小通过字符“:”分割成数组
                  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);     //如果此控件存在子控件,则将相应子控件执行一次setControls函数

    }

  }

OK OK OK, 照搬,哈哈哈~~~

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部