设置Winform窗体内控件跟随窗体大小变化而变化

点击查看代码
#region 界面放大处理
 private float x;        //窗体大小全局变量
 private float y;        //窗体大小全局变量
 #region 获取控件的width、height、left、top、字体大小值,存放在控件的Tag属性中
 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);        //递归调用
         }
     }
 }
 #endregion

 #region 根据窗体缩放比例调整窗体中控件的大小,自定义方法setControl()
 private void setControls(float newx, float newy, Control cons)
 {
     //遍历窗体中的控件,重新设置控件的值
     foreach (Control con in cons.Controls)
     {
         try
         {
             if (con.Tag == null) continue;
             //获取控件的Tag属性值,并分割后存储字符串数组
             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;
      
             if (con.Controls.Count > 0)
             {
                 setControls(newx, newy, con);
             }
         }
         catch
         { }
     }
 }
 #endregion

 [DllImport("user32")]
 private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, IntPtr lParam);
 private const int WM_SETREDRAW = 0xB;

 #region 在放大点击事件中处理
 private void PathForm_Resize(object sender, EventArgs e)
 {
     SendMessage(this.Handle, WM_SETREDRAW, 0, IntPtr.Zero);
     float newx = (this.Width) / x;
     float newy = (this.Height) / y;
     setControls(newx, newy, this);
     SendMessage(this.Handle, WM_SETREDRAW, 1, IntPtr.Zero);
     this.Invalidate(true);
 }
 #endregion

 #endregion

全局变量和标记初始状态
x 和 y 这两个变量代表窗体的初始宽度和高度,用来计算缩放比例。
setTag(Control cons) 方法用于遍历窗体内的所有控件,将它们的初始属性值(Width、Height、Left、Top、Font.Size)存储在 Tag 属性中。这样可以方便在窗体大小变化时根据初始状态调整控件。
调整控件大小和位置
setControls(float newx, float newy, Control cons) 方法用于根据新的缩放比例调整控件的大小、位置和字体大小。这个方法会:
遍历传入的 Control 的所有子控件。
从 Tag 属性中获取控件的初始宽度、高度、左侧距离、顶部距离和字体大小。
根据新的缩放比例调整控件的属性。
递归调用,以确保调整所有子控件。
为防止异常情况,这里有简单的 try-catch 以防止异常导致应用程序崩溃。
在窗体大小变化时调整控件
PathForm_Resize(object sender, EventArgs e) 是窗体的 Resize 事件处理程序。在窗体大小发生变化时触发。
它首先调用 SendMessage(this.Handle, WM_SETREDRAW, 0, IntPtr.Zero),禁用重绘。这样可以防止调整期间的闪烁。
然后计算新的缩放比例:newx 为新的窗体宽度相对于初始宽度的比率,newy 为新的窗体高度相对于初始高度的比率。
调用 setControls(newx, newy, this) 来调整窗体内的控件。
最后,重新启用重绘,并调用 this.Invalidate(true) 强制窗体重绘。
注意事项

posted @   Erik_apex  阅读(803)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示