1.在窗体的Project中建一个自适应的类.

2.类的代码如下

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

3.在窗体中实现自适应

  1. AutoSizeForm asc = new AutoSizeForm();//创建一个自适应类的对象
  2. asc.controllInitializeSize(this);//在Load加载函数中
  3. asc.controlAutoSize(this);//写在From的SizeChanged事件中

按以上的三部操作便可以实现自适应C# WinFrom.

C# WinFrom自适应的更多相关文章

  1. winfrom窗体自适应

    using System.Runtime.InteropServices; public class Win32 { public const Int32 AW_HOR_POSITIVE = 0x00 ...

  2. C# WinForm 技巧十: winfrom 全屏自适应屏幕分辨率

    Rectangle rect = new Rectangle(); rect = Screen.GetWorkingArea(this); this.Width = rect.Width;//屏幕宽 ...

  3. Winfrom PictureBox 设置图片自适应

    初始状态 Bitmap bm = new Bitmap(Image.FromStream(System.Net.WebRequest.Create(new Uri(result.Result)).Ge ...

  4. 【2017-12-06】winfrom 窗体自启最大化,控件自适应

    先将窗体windowstate属性设置为Maximized public partial class Form1 : Form { public Form1() { InitializeCompone ...

  5. div实现自适应高度的textarea,实现angular双向绑定

    相信不少同学模拟过腾讯的QQ做一个聊天应用,至少我是其中一个. 过程中我遇到的一个问题就是QQ输入框,自适应高度,最高高度为3row. 如果你也像我一样打算使用textarea,那么很抱歉,你一开始就 ...

  6. iOS开发之多种Cell高度自适应实现方案的UI流畅度分析

    本篇博客的主题是关于UI操作流畅度优化的一篇博客,我们以TableView中填充多个根据内容自适应高度的Cell来作为本篇博客的使用场景.当然Cell高度的自适应网上的解决方案是铺天盖地呢,今天我们的 ...

  7. 浅谈Web自适应

    前言 随着移动设备的普及,移动web在前端工程师们的工作中占有越来越重要的位置.移动设备更新速度频繁,手机厂商繁多,导致的问题是每一台机器的屏幕宽度和分辨率不一样.这给我们在编写前端界面时增加了困难, ...

  8. 微信小程序新单位rpx与自适应布局

    rpx是微信小程序新推出的一个单位,按官方的定义,rpx可以根据屏幕宽度进行自适应,在rpx出现之前,web页面的自适应布局已经有了多种解决方案,为什么微信还捣鼓出新的rpx单位?在解释这个单位前,我 ...

  9. 这可能是史上最全的CSS自适应布局总结教程

    标题严格遵守了新广告法,你再不爽,我也没犯法呀!话不多说,直入正题. 所谓布局,其实包含两个含义:尺寸与定位.也就是说,所有与尺寸和定位相关的属性,都可以用来布局. 大体上,布局中会用到的有:尺寸相关 ...

随机推荐

  1. OpenFlow/SDN 的缘起与发展

    目录 文章目录 目录 从虚拟机动态迁移对大二层网络的需求说起 OpenFlow 起源 从 OpenFlow 扩展为 SDN OpenFlow 的应用场景 网络虚拟化 – FlowVisor 负载均衡 ...

  2. 慕课网_Java Socket应用---通信是这样练成的

    第1章 网络基础知识 1-1 网络基础简介 (10:21) 第2章 Java 中网络相关 API 的应用 2-1 Java 中的 InetAddress 的应用 (08:10) import java ...

  3. nginx查看并发数量

    cat >> /etc/nginx/conf.d/status.conf << EOF server{ listen ; server_name www.test2.com; ...

  4. Redis 入门 3.3 散列类型

    3.3.1 介绍   散列类型(hash)的键值也是一种字典结构,其储存了字段(field)和字段值的映射,但字段值只能是字符串,不支持其他数据类型,换句话说,散列类型不能嵌套其他的数据类型.一个散列 ...

  5. 错误:expected initializer before "***"

    今天写了一个程序,编译时报了一个错误:expected initializer before "***"报错的语句只是程序开头的一个变量定义语句,怎么会有这样的错误呢,琢磨了半天也 ...

  6. 【HANA系列】SAP HANA跟我学HANA系列之创建属性视图一

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA跟我学HANA系 ...

  7. 在Linux上实现Python调用C语言函数

    一般思路 Python中内置ctypes库,需调用c编译成的.so文件来实现函数调用. 假设我们所需调用的c文件名为test.c,文件里有我们需要的函数func(x,y). 将.c文件编译成 .so文 ...

  8. react 中 EventEmitter 事件总线机制

    此机制可用于 react 中兄弟组件中的通信 npm install events -S 事件总线: // eventBus.js import {EventEmitter} from 'events ...

  9. switch-case分支结构总结

    1,格式 switch(表达式){ case 常量1:执行语句1: case 常量1:执行语句1: ... ... case 常量n:执行语句n: default:执行语句:} 2,说明: 根据swi ...

  10. 在子类中,若要调用父类中被覆盖的方法,可以使用super关键字

    在子类中,若要调用父类中被覆盖的方法,可以使用super关键字. package text; class Parent {    int x;    public Parent()    {      ...