设置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) 强制窗体重绘。
注意事项
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!