WinForm实现窗体自适应缩放
创作时间:
作者:
@小白创作中心
WinForm实现窗体自适应缩放
引用
CSDN
1.
https://blog.csdn.net/qq_26303227/article/details/146226168
WinForm采用基于像素的布局模型,因此原生WinForm对于窗体自适应支持不是很好。但是我们也可以通过代码来实现。今天跟大家分享一下如何实现WinForm窗体自适应。
界面布局
当我们想要实现窗体自适应的时候,优先要通过界面布局设置好窗体和控件的一些属性:
- Anchor:用于固定控件的边缘到窗体的边缘,当窗体大小改变时,控件的位置也会相应改变。
- Dock:用于将控件停靠到窗体的边缘,控件的大小会随着窗体边缘的改变而改变。
- 布局控件:使用
TableLayoutPanel
或FlowLayoutPanel
等布局控件可以更好地管理控件的布局,它们可以自动调整大小和位置。 - Padding:Padding属性定义控件内部的一段空间,用于将控件的内容保持在距控件边框一定的距离。
- Margin:Margin属性定义控件周围的空间,该空间使其他控件与控件的边框保持指定距离。
代码实现
除了以上方法外,在实际应用中,我们更多会使用通过代码来手动调整窗体和控件的大小和位置,这种方法第一次写的时候会麻烦一些,但是封装好之后,后续应用也比较简单。
一、创建FormAutoSize类
我们创建一个类 FormAutoSize
,然后创建三个字段,分别是窗体宽度、高度和窗体对象。
public class FormAutoSize
{
//窗体对象
private Form form;
//定义当前窗体的宽度
private float width;
//定义当前窗体的高度
private float height;
}
二、初始化控件属性
在 FormAutoSize
类的构造方法中,初始化宽度、高度和窗体对象,同时将各个控件的宽度、高度、左边距、上边距以及字体大小,按照指定的格式(这里使用分号拼接)存储到 AccessibleDescription
属性里,因为 AccessibleDescription
属性很少使用,所以存储到这个属性里。
private void SetDescription(Control cons)
{
foreach (Control ctl in cons.Controls)
{
ctl.AccessibleDescription = ctl.Width + ";" + ctl.Height + ";" + ctl.Left +
";" + ctl.Top + ";" + ctl.Font.Size;
//递归
if (ctl.Controls.Count > 0)
{
SetDescription(ctl);
}
}
}
public FormAutoSize(Form form)
{
this.form = form;
width = this.form.Width;
height = this.form.Height;
SetDescription(this.form);
}
三、重置窗体控件布局
接下来就是如何重置窗体控件布局,这里将当前的宽度高度与初始宽度高度进行相除,会得到比例系数 scaleX/scaleY
,然后将这个系数叠加进去,得到新的宽度高度等属性值,然后重新设置控件属性即可。
private void SetControls(float scaleX, float scaleY, Control cons)
{
//遍历窗体中的控件,重新设置控件的值
foreach (Control con in cons.Controls)
{
//获取控件的AccessibleDescription属性值,并分割后存储字符串数组
if (con.AccessibleDescription != null)
{
var tag = con.AccessibleDescription.ToString().Split(';');
//根据窗体缩放的比例确定控件的值
con.Width = Convert.ToInt32(Convert.ToSingle(tag[0]) * scaleX); //宽度
con.Height = Convert.ToInt32(Convert.ToSingle(tag[1]) * scaleY); //高度
con.Left = Convert.ToInt32(Convert.ToSingle(tag[2]) * scaleX); //左边距
con.Top = Convert.ToInt32(Convert.ToSingle(tag[3]) * scaleY); //顶边距
var currentSize = Convert.ToSingle(tag[4]) * scaleY; //字体大小
if (currentSize > 0)
{
con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit);
}
con.Focus();
if (con.Controls.Count > 0)
{
SetControls(scaleX, scaleY, con);
}
}
}
}
/// <summary>
/// 重置窗体布局
/// </summary>
public void ResumeLayout()
{
var scaleX = form.Width / width;
var scaleY = form.Height / height;
SetControls(scaleX, scaleY, form);
}
四、调用方法
最后一步就是如何进行调用:首先在需要进行缩放的窗体中定义一个 FormAutoSize
对象,然后在构造方法中实例化该对象,将当前窗体 this
作为参数传递进去,最后在窗体的 SizeChanged
事件中调用该对象的 ResumeLayout
方法。
private FormAutoSize formAutoSize;
public FrmMain()
{
InitializeComponent();
formAutoSize = new FormAutoSize(this);
this.SizeChanged += (sender, e) =>
{
formAutoSize.ResumeLayout();
};
}
五、测试效果
缩放前尺寸:1280*720
缩放后尺寸:1420*827
热门推荐
成长的底层逻辑:生命以负熵为生
文山州3个案例入选2024年云南省“非遗进校园”优秀实践案例名单
专家:全球IPv6部署率加速提高
治口水过多的妙招
1989年属蛇人的个性特点
快递拒收与退货:运费承担与责任归属解析
明朝末年崇祯上位,他真的有机会拯救大明吗?
二手房翻新:先换窗户还是先刷墙?
守护历史文脉 讲好世遗泉州故事
术后半月是否可以进行汗蒸?医生的专业建议来了
利用多重语境,渗透汉字文化
怎么判断咳嗽要吃消炎药
增肌期和减脂期时间:如何一边增肌一边减脂
PPT布局设计指南,7个不容错过的小贴士
宇宙到底有多大?它有边界吗?边界之外又会是什么?
慢性胰腺炎——需要警惕的隐形“敌人”
孕妇能不能吃木糖醇
PPT分辨率调整指南:从设计尺寸到输出设置的全面优化
大树移栽后常见问题及对策
银杏家园公益项目——890余位老人,180000余次助餐的背后
酷熱天飲食 如何防乳癌?(26-08-2024)
加强小学课程改革的质量提升措施
鼓膜修补术的手术方法
得抑郁症的原因是什么引起的
中断优先级配置
葡糖酸水溶液的性质、作用与制取方法
热泵空调:电动车的智能温控系统
罗瑟汉姆主场强势,威科姆需克服状态低迷挑战
春季过敏性皮炎:诱因、预防与治疗全攻略
交错级数收敛的判别法有哪些