C# winform中 窗体缩放自适应的方法(不同电脑/不同分辨率)

您所在的位置:网站首页 设置电脑屏幕大小的尺寸 C# winform中 窗体缩放自适应的方法(不同电脑/不同分辨率)

C# winform中 窗体缩放自适应的方法(不同电脑/不同分辨率)

2023-11-14 10:24| 来源: 网络整理| 查看: 265

窗体缩放是一个困扰我多时的问题,为了解决这个问题,我从网上找了很多相关的资料,很多人说用Anchor和Dock属性,但是我试了以后,始终不能达到想要的效果。

后来,搜到了一个帖子,终于解决了这个问题,再次对该贴作者表示感谢。原帖链接为:   http://www.cnblogs.com/sydeveloper/archive/2013/01/29/2881521.html

以下是笔者的实现过程:   1. 首先在窗体上放上一个Panel容器,并将容器的Dock属性设为Fill,即所有的控件都放在了这个容器里。   2. 设置缩放窗体时需要用到的变量:

#region 控件缩放 double formWidth;//窗体原始宽度 double formHeight;//窗体原始高度 double scaleX;//水平缩放比例 double scaleY;//垂直缩放比例 Dictionary ControlsInfo = new Dictionary();//控件中心Left,Top,控件Width,控件Height,控件字体Size #endregion

3. 自定义几个方法,用以实现 (1)获取控件初始信息;GetAllInitInfo() (2)获取窗体缩放比例;ControlsChaneInit() (3)窗体改变时修改控件大小。ControlsChange()

protected void GetAllInitInfo(Control ctrlContainer) { if (ctrlContainer.Parent == this)//获取窗体的高度和宽度 { formWidth = Convert.ToDouble(ctrlContainer.Width); formHeight = Convert.ToDouble(ctrlContainer.Height); } foreach (Control item in ctrlContainer.Controls) { if (item.Name.Trim() != "") { //添加信息:键值:控件名,内容:据左边距离,距顶部距离,控件宽度,控件高度,控件字体。 ControlsInfo.Add(item.Name, (item.Left + item.Width / 2) + "," + (item.Top + item.Height / 2) + "," + item.Width + "," + item.Height + "," + item.Font.Size); } if ((item as UserControl) == null && item.Controls.Count > 0) { GetAllInitInfo(item); } } } private void ControlsChaneInit(Control ctrlContainer) { scaleX = (Convert.ToDouble(ctrlContainer.Width) / formWidth); scaleY = (Convert.ToDouble(ctrlContainer.Height) / formHeight); } /// /// 改变控件大小 /// /// private void ControlsChange(Control ctrlContainer) { double[] pos = new double[5];//pos数组保存当前控件中心Left,Top,控件Width,控件Height,控件字体Size foreach (Control item in ctrlContainer.Controls)//遍历控件 { if (item.Name.Trim() != "")//如果控件名不是空,则执行 { if ((item as UserControl) == null && item.Controls.Count > 0)//如果不是自定义控件 { ControlsChange(item);//循环执行 } string[] strs = ControlsInfo[item.Name].Split(',');//从字典中查出的数据,以‘,’分割成字符串组 for (int i = 0; i if (ControlsInfo.Count > 0)//如果字典中有数据,即窗体改变 { ControlsChangeInit(this.Controls[0]);//表示pannel控件 ControlsChange(this.Controls[0]); } }

经过上述几个步骤,即可实现窗体的自由缩放,它的基本思想是:通过对控件的尺寸进行重置来实现窗体的自适应。即,先将原窗体的初始值进行存储,然后通过SizeChange事件响应窗体改变,实现重绘。

需要注意的是:获取初始值的方法,应该放在构造函数中,而不是Load事件中,这个问题导致我绕了个弯。

再补充: 对于tabControl内显示的临时处理方法,窗体统一放在一个control里(可用上panel类似),然后再加载窗体时,调用GetAllInitInfo方法(如此只是将其他说有控件除panel外的注册进来了,所以还是需要trycatch捕获一下) (如有更好的方法再行补充) 补充二: 也可通过设置winform 的AutoScaleMode属性



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3