1. 1.添加一个类
    class AutoSizeFormClass
  2. {
  3. //(1).声明结构,只记录窗体和其控件的初始位置和大小。
  4. public struct controlRect
  5. {
  6. public int Left;
  7. public int Top;
  8. public int Width;
  9. public int Height;
  10. }
  11. //(2).声明 1个对象
  12. //注意这里不能使用控件列表记录 List nCtrl;,因为控件的关联性,记录的始终是当前的大小。
  13. // public List oldCtrl= new List();//这里将西文的大于小于号都过滤掉了,只能改为中文的,使用中要改回西文
  14. public List<controlRect> oldCtrl = new List<controlRect>();
  15. int ctrlNo = 0;//1;
  16. //(3). 创建两个函数
  17. //(3.1)记录窗体和其控件的初始位置和大小,
  18. public void controllInitializeSize(Control mForm)
  19. {
  20. controlRect cR;
  21. cR.Left = mForm.Left; cR.Top = mForm.Top; cR.Width = mForm.Width; cR.Height = mForm.Height;
  22. oldCtrl.Add(cR);//第一个为"窗体本身",只加入一次即可
  23. AddControl(mForm);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用
  24. //this.WindowState = (System.Windows.Forms.FormWindowState)(2);//记录完控件的初始位置和大小后,再最大化
  25. //0 - Normalize , 1 - Minimize,2- Maximize
  26. }
  27. private void AddControl(Control ctl)
  28. {
  29. foreach (Control c in ctl.Controls)
  30. { //**放在这里,是先记录控件的子控件,后记录控件本身
  31. //if (c.Controls.Count > 0)
  32. // AddControl(c);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用
  33. controlRect objCtrl;
  34. objCtrl.Left = c.Left; objCtrl.Top = c.Top; objCtrl.Width = c.Width; objCtrl.Height = c.Height;
  35. oldCtrl.Add(objCtrl);
  36. //**放在这里,是先记录控件本身,后记录控件的子控件
  37. if (c.Controls.Count > 0)
  38. AddControl(c);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用
  39. }
  40. }
  41. //(3.2)控件自适应大小,
  42. public void controlAutoSize(Control mForm)
  43. {
  44. if (ctrlNo == 0)
  45. { //*如果在窗体的Form1_Load中,记录控件原始的大小和位置,正常没有问题,但要加入皮肤就会出现问题,因为有些控件如dataGridView的的子控件还没有完成,个数少
  46. //*要在窗体的Form1_SizeChanged中,第一次改变大小时,记录控件原始的大小和位置,这里所有控件的子控件都已经形成
  47. controlRect cR;
  48. // cR.Left = mForm.Left; cR.Top = mForm.Top; cR.Width = mForm.Width; cR.Height = mForm.Height;
  49. cR.Left = 0; cR.Top = 0; cR.Width = mForm.PreferredSize.Width; cR.Height = mForm.PreferredSize.Height;
  50.  
  51. oldCtrl.Add(cR);//第一个为"窗体本身",只加入一次即可
  52. AddControl(mForm);//窗体内其余控件可能嵌套其它控件(比如panel),故单独抽出以便递归调用
  53. }
  54. float wScale = (float)mForm.Width / (float)oldCtrl[0].Width;//新旧窗体之间的比例,与最早的旧窗体
  55. float hScale = (float)mForm.Height / (float)oldCtrl[0].Height;//.Height;
  56. ctrlNo = 1;//进入=1,第0个为窗体本身,窗体内的控件,从序号1开始
  57. AutoScaleControl(mForm, wScale, hScale);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用
  58. }
  59. private void AutoScaleControl(Control ctl, float wScale, float hScale)
  60. {
  61. int ctrLeft0, ctrTop0, ctrWidth0, ctrHeight0;
  62. //int ctrlNo = 1;//第1个是窗体自身的 Left,Top,Width,Height,所以窗体控件从ctrlNo=1开始
  63. foreach (Control c in ctl.Controls)
  64. { //**放在这里,是先缩放控件的子控件,后缩放控件本身
  65. //if (c.Controls.Count > 0)
  66. // AutoScaleControl(c, wScale, hScale);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用
  67. ctrLeft0 = oldCtrl[ctrlNo].Left;
  68. ctrTop0 = oldCtrl[ctrlNo].Top;
  69. ctrWidth0 = oldCtrl[ctrlNo].Width;
  70. ctrHeight0 = oldCtrl[ctrlNo].Height;
  71. //c.Left = (int)((ctrLeft0 - wLeft0) * wScale) + wLeft1;//新旧控件之间的线性比例
  72. //c.Top = (int)((ctrTop0 - wTop0) * h) + wTop1;
  73. c.Left = (int)((ctrLeft0) * wScale);//新旧控件之间的线性比例。控件位置只相对于窗体,所以不能加 + wLeft1
  74. c.Top = (int)((ctrTop0) * hScale);//
  75. c.Width = (int)(ctrWidth0 * wScale);//只与最初的大小相关,所以不能与现在的宽度相乘 (int)(c.Width * w);
  76. c.Height = (int)(ctrHeight0 * hScale);//
  77. ctrlNo++;//累加序号
  78. //**放在这里,是先缩放控件本身,后缩放控件的子控件
  79. if (c.Controls.Count > 0)
  80. AutoScaleControl(c, wScale, hScale);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用
  81.  
  82. if (ctl is DataGridView)
  83. {
  84. DataGridView dgv = ctl as DataGridView;
  85. Cursor.Current = Cursors.WaitCursor;
  86.  
  87. int widths = 0;
  88. for (int i = 0; i < dgv.Columns.Count; i++)
  89. {
  90. dgv.AutoResizeColumn(i, DataGridViewAutoSizeColumnMode.AllCells); // 自动调整列宽
  91. widths += dgv.Columns[i].Width; // 计算调整列后单元列的宽度和
  92. }
  93. if (widths >= ctl.Size.Width) // 如果调整列的宽度大于设定列宽
  94. dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; // 调整列的模式 自动
  95. else
  96. dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; // 如果小于 则填充
  97.  
  98. Cursor.Current = Cursors.Default;
  99. }
  100. }
  101.  
  102. }
  103. }

2.实例化

AutoSize as = new AutoSize();

3.Form1_Load

as.controllInitializeSize(this);

4.Form1_SizeChanged事件中

as.controlAutoSize(this);

这样就实现了窗口控件自适应form大小了

winform窗体自适应大小的更多相关文章

  1. (C#)找的winform窗体自适应类

    原文:https://www.cnblogs.com/gguozhenqian/p/4288451.html 需要添加引用System.Windows.Forms public class AutoS ...

  2. WinForm窗体自适应分辨率

    我们自己编写程序的界面,会遇到各种屏幕分辨率,只有自适应才能显的美观.实际上,做到这点也很简单,就是首先记录窗体和它上面控件的初始位置和大小,当窗体改变比例时,其控件的位置和大小也按此比例变化即可.因 ...

  3. Winform 窗体自适应

    前言 在使用 Winform 开发过程中,经常发些因为显示器分辨率.窗体大小改变,控件却不能自适应变化,几经查找资料,和大佬的代码.经过细小修改,终于可以让窗体在外界影响下,窗体内背景图片.控件都会自 ...

  4. 让WinForm窗体的大小固定,不能调整大小

    窗体FormBorderStyle属性设置为:FixedSingle,再把最大化禁用就可以了

  5. Winform窗体控件自适应大小

    自己写的winform窗体自适应大小代码,代码比较独立,很适合贴来贴去不会对原有程序造成影响,可以直接继承此类或者把代码复制到自己的代码里面直接使用 借鉴了网上的一些资料,最后采用重写WndProc方 ...

  6. Winform 窗体的操作

    原文:http://www.cnblogs.com/Billy-rao/archive/2012/05/16/2503437.html 怎样能使winform窗体的大小固定住,不能调整其大小 窗体Fo ...

  7. C# Winform窗体和控件自适应大小

    1.在项目中创建类AutoSizeForm AutoSizeForm.cs文件代码: using System; using System.Collections.Generic; using Sys ...

  8. WinForm窗体及其控件的自适应

    3步骤: 1.在需要自适应的Form中实例化全局变量   AutoSizeFormClass.cs源码在下方 AutoSizeFormClass asc = new AutoSizeFormClass ...

  9. 转:C# WinForm窗体及其控件的自适应

    一.说明 2012-11-30 曾经写过 <C# WinForm窗体及其控件自适应各种屏幕分辨率>  ,其中也讲解了控件自适应的原理.近期有网友说,装在panel里面的控件,没有效果? 这 ...

随机推荐

  1. InnoDB Multi-Versioning

    InnoDB 是一个数据多版本的存储引擎,它会保持它修改的数据的旧版本数据以此来支持事务特性,比如并发操作和事务的回滚.这些旧版本数据存储在一个叫做rollback segment的数据结构中(回滚段 ...

  2. LOJ 510: 「LibreOJ NOI Round #1」北校门外的回忆

    题目传送门:LOJ #510. 题意简述: 给出一个在 \(K\) 进制下的树状数组,但是它的实现有问题. 形式化地说,令 \(\mathrm{lowbit}(x)\) 为在 \(K\) 进制下的 \ ...

  3. SQLAlchemy(1)

    介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获取 ...

  4. Spring(003)-消费返回list的rest服务

    通过spring提供的RestTemplate就可以访问rest服务.首先需要创建一个RestTemplate,这个需要手动来创建bean @Configuration public class De ...

  5. 用Jetpack的Site Accelerator为网站CDN加速

    Jetpack 的Site Accelerator站点加速器(前身为 Photon,注意:“Photon”现在是站点加速器的一部分)允许 Jetpack 优化图像并通过他们的全球服务器网络CDN提供图 ...

  6. python json解析字符串出错该如何排查问题

    每天写一点,总有一天我这条咸鱼能变得更咸 python中对于字符串转json格式有专门的json库可以操作 #!/usr/bin/env python # -*- coding: utf-8 -*- ...

  7. Linux下Nginx的安装(二)

    一.安装Nginx ## 安装前准备 ## #GNU编译器集合 #Nginx编译需要PCRE #在Nginx的各种模块中需要使用gzip压缩 #在Nginx中,如果服务器提供安全网页时则会用到Open ...

  8. 每天一道Rust-LeetCode(2019-06-07)

    每天一道Rust-LeetCode(2019-06-07) 622. 设计循环队列 坚持每天一道题,刷题学习Rust. 原题 题目描述 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基 ...

  9. appium--元素等待和屏幕截图

    元素等待 设置元素等待可以更加灵活的指定等待元素的时间,从而增强脚本的健壮性,提高执行效率 强制等待 from time import sleep sleep(5) 隐式等待 隐式等待是针对全部元素设 ...

  10. [LeetCode] 241. Different Ways to Add Parentheses 添加括号的不同方式

    Given a string of numbers and operators, return all possible results from computing all the differen ...