winform窗体自适应大小
- 1.添加一个类
class AutoSizeFormClass- {
- //(1).声明结构,只记录窗体和其控件的初始位置和大小。
- public struct controlRect
- {
- public int Left;
- public int Top;
- public int Width;
- public int Height;
- }
- //(2).声明 1个对象
- //注意这里不能使用控件列表记录 List nCtrl;,因为控件的关联性,记录的始终是当前的大小。
- // public List oldCtrl= new List();//这里将西文的大于小于号都过滤掉了,只能改为中文的,使用中要改回西文
- public List<controlRect> oldCtrl = new List<controlRect>();
- int ctrlNo = 0;//1;
- //(3). 创建两个函数
- //(3.1)记录窗体和其控件的初始位置和大小,
- public void controllInitializeSize(Control mForm)
- {
- controlRect cR;
- cR.Left = mForm.Left; cR.Top = mForm.Top; cR.Width = mForm.Width; cR.Height = mForm.Height;
- oldCtrl.Add(cR);//第一个为"窗体本身",只加入一次即可
- AddControl(mForm);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用
- //this.WindowState = (System.Windows.Forms.FormWindowState)(2);//记录完控件的初始位置和大小后,再最大化
- //0 - Normalize , 1 - Minimize,2- Maximize
- }
- private void AddControl(Control ctl)
- {
- foreach (Control c in ctl.Controls)
- { //**放在这里,是先记录控件的子控件,后记录控件本身
- //if (c.Controls.Count > 0)
- // AddControl(c);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用
- controlRect objCtrl;
- objCtrl.Left = c.Left; objCtrl.Top = c.Top; objCtrl.Width = c.Width; objCtrl.Height = c.Height;
- oldCtrl.Add(objCtrl);
- //**放在这里,是先记录控件本身,后记录控件的子控件
- if (c.Controls.Count > 0)
- AddControl(c);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用
- }
- }
- //(3.2)控件自适应大小,
- public void controlAutoSize(Control mForm)
- {
- if (ctrlNo == 0)
- { //*如果在窗体的Form1_Load中,记录控件原始的大小和位置,正常没有问题,但要加入皮肤就会出现问题,因为有些控件如dataGridView的的子控件还没有完成,个数少
- //*要在窗体的Form1_SizeChanged中,第一次改变大小时,记录控件原始的大小和位置,这里所有控件的子控件都已经形成
- controlRect cR;
- // cR.Left = mForm.Left; cR.Top = mForm.Top; cR.Width = mForm.Width; cR.Height = mForm.Height;
- cR.Left = 0; cR.Top = 0; cR.Width = mForm.PreferredSize.Width; cR.Height = mForm.PreferredSize.Height;
- oldCtrl.Add(cR);//第一个为"窗体本身",只加入一次即可
- AddControl(mForm);//窗体内其余控件可能嵌套其它控件(比如panel),故单独抽出以便递归调用
- }
- float wScale = (float)mForm.Width / (float)oldCtrl[0].Width;//新旧窗体之间的比例,与最早的旧窗体
- float hScale = (float)mForm.Height / (float)oldCtrl[0].Height;//.Height;
- ctrlNo = 1;//进入=1,第0个为窗体本身,窗体内的控件,从序号1开始
- AutoScaleControl(mForm, wScale, hScale);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用
- }
- private void AutoScaleControl(Control ctl, float wScale, float hScale)
- {
- int ctrLeft0, ctrTop0, ctrWidth0, ctrHeight0;
- //int ctrlNo = 1;//第1个是窗体自身的 Left,Top,Width,Height,所以窗体控件从ctrlNo=1开始
- foreach (Control c in ctl.Controls)
- { //**放在这里,是先缩放控件的子控件,后缩放控件本身
- //if (c.Controls.Count > 0)
- // AutoScaleControl(c, wScale, hScale);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用
- ctrLeft0 = oldCtrl[ctrlNo].Left;
- ctrTop0 = oldCtrl[ctrlNo].Top;
- ctrWidth0 = oldCtrl[ctrlNo].Width;
- ctrHeight0 = oldCtrl[ctrlNo].Height;
- //c.Left = (int)((ctrLeft0 - wLeft0) * wScale) + wLeft1;//新旧控件之间的线性比例
- //c.Top = (int)((ctrTop0 - wTop0) * h) + wTop1;
- c.Left = (int)((ctrLeft0) * wScale);//新旧控件之间的线性比例。控件位置只相对于窗体,所以不能加 + wLeft1
- c.Top = (int)((ctrTop0) * hScale);//
- c.Width = (int)(ctrWidth0 * wScale);//只与最初的大小相关,所以不能与现在的宽度相乘 (int)(c.Width * w);
- c.Height = (int)(ctrHeight0 * hScale);//
- ctrlNo++;//累加序号
- //**放在这里,是先缩放控件本身,后缩放控件的子控件
- if (c.Controls.Count > 0)
- AutoScaleControl(c, wScale, hScale);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用
- if (ctl is DataGridView)
- {
- DataGridView dgv = ctl as DataGridView;
- Cursor.Current = Cursors.WaitCursor;
- int widths = 0;
- for (int i = 0; i < dgv.Columns.Count; i++)
- {
- dgv.AutoResizeColumn(i, DataGridViewAutoSizeColumnMode.AllCells); // 自动调整列宽
- widths += dgv.Columns[i].Width; // 计算调整列后单元列的宽度和
- }
- if (widths >= ctl.Size.Width) // 如果调整列的宽度大于设定列宽
- dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; // 调整列的模式 自动
- else
- dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; // 如果小于 则填充
- Cursor.Current = Cursors.Default;
- }
- }
- }
- }
2.实例化
AutoSize as = new AutoSize();
3.Form1_Load
as.controllInitializeSize(this);
4.Form1_SizeChanged事件中
as.controlAutoSize(this);
这样就实现了窗口控件自适应form大小了
winform窗体自适应大小的更多相关文章
- (C#)找的winform窗体自适应类
原文:https://www.cnblogs.com/gguozhenqian/p/4288451.html 需要添加引用System.Windows.Forms public class AutoS ...
- WinForm窗体自适应分辨率
我们自己编写程序的界面,会遇到各种屏幕分辨率,只有自适应才能显的美观.实际上,做到这点也很简单,就是首先记录窗体和它上面控件的初始位置和大小,当窗体改变比例时,其控件的位置和大小也按此比例变化即可.因 ...
- Winform 窗体自适应
前言 在使用 Winform 开发过程中,经常发些因为显示器分辨率.窗体大小改变,控件却不能自适应变化,几经查找资料,和大佬的代码.经过细小修改,终于可以让窗体在外界影响下,窗体内背景图片.控件都会自 ...
- 让WinForm窗体的大小固定,不能调整大小
窗体FormBorderStyle属性设置为:FixedSingle,再把最大化禁用就可以了
- Winform窗体控件自适应大小
自己写的winform窗体自适应大小代码,代码比较独立,很适合贴来贴去不会对原有程序造成影响,可以直接继承此类或者把代码复制到自己的代码里面直接使用 借鉴了网上的一些资料,最后采用重写WndProc方 ...
- Winform 窗体的操作
原文:http://www.cnblogs.com/Billy-rao/archive/2012/05/16/2503437.html 怎样能使winform窗体的大小固定住,不能调整其大小 窗体Fo ...
- C# Winform窗体和控件自适应大小
1.在项目中创建类AutoSizeForm AutoSizeForm.cs文件代码: using System; using System.Collections.Generic; using Sys ...
- WinForm窗体及其控件的自适应
3步骤: 1.在需要自适应的Form中实例化全局变量 AutoSizeFormClass.cs源码在下方 AutoSizeFormClass asc = new AutoSizeFormClass ...
- 转:C# WinForm窗体及其控件的自适应
一.说明 2012-11-30 曾经写过 <C# WinForm窗体及其控件自适应各种屏幕分辨率> ,其中也讲解了控件自适应的原理.近期有网友说,装在panel里面的控件,没有效果? 这 ...
随机推荐
- InnoDB Multi-Versioning
InnoDB 是一个数据多版本的存储引擎,它会保持它修改的数据的旧版本数据以此来支持事务特性,比如并发操作和事务的回滚.这些旧版本数据存储在一个叫做rollback segment的数据结构中(回滚段 ...
- LOJ 510: 「LibreOJ NOI Round #1」北校门外的回忆
题目传送门:LOJ #510. 题意简述: 给出一个在 \(K\) 进制下的树状数组,但是它的实现有问题. 形式化地说,令 \(\mathrm{lowbit}(x)\) 为在 \(K\) 进制下的 \ ...
- SQLAlchemy(1)
介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获取 ...
- Spring(003)-消费返回list的rest服务
通过spring提供的RestTemplate就可以访问rest服务.首先需要创建一个RestTemplate,这个需要手动来创建bean @Configuration public class De ...
- 用Jetpack的Site Accelerator为网站CDN加速
Jetpack 的Site Accelerator站点加速器(前身为 Photon,注意:“Photon”现在是站点加速器的一部分)允许 Jetpack 优化图像并通过他们的全球服务器网络CDN提供图 ...
- python json解析字符串出错该如何排查问题
每天写一点,总有一天我这条咸鱼能变得更咸 python中对于字符串转json格式有专门的json库可以操作 #!/usr/bin/env python # -*- coding: utf-8 -*- ...
- Linux下Nginx的安装(二)
一.安装Nginx ## 安装前准备 ## #GNU编译器集合 #Nginx编译需要PCRE #在Nginx的各种模块中需要使用gzip压缩 #在Nginx中,如果服务器提供安全网页时则会用到Open ...
- 每天一道Rust-LeetCode(2019-06-07)
每天一道Rust-LeetCode(2019-06-07) 622. 设计循环队列 坚持每天一道题,刷题学习Rust. 原题 题目描述 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基 ...
- appium--元素等待和屏幕截图
元素等待 设置元素等待可以更加灵活的指定等待元素的时间,从而增强脚本的健壮性,提高执行效率 强制等待 from time import sleep sleep(5) 隐式等待 隐式等待是针对全部元素设 ...
- [LeetCode] 241. Different Ways to Add Parentheses 添加括号的不同方式
Given a string of numbers and operators, return all possible results from computing all the differen ...