1.  首先在窗体上放上一个Panel容器,并将容器的Dock属性设为Fill,即所有的控件都放在了这个容器里。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Text;
  5. using System.Windows.Forms;
  6.  
  7. namespace WindowsFormsApp2
  8. {
  9. class AutoAdaptWindowsSize
  10. {
  11. double formOriginalWidth;//窗体原始宽度
  12. double formOriginalHeight;//窗体原始高度
  13. double scaleX;//水平缩放比例
  14. double scaleY;//垂直缩放比例
  15. Dictionary<string, string> ControlsInfo = new Dictionary<string, string>();//控件中心Left,Top,控件Width,控件Height,控件字体Size
  16.  
  17. private Form _form;
  18. public AutoAdaptWindowsSize(Form form)
  19. {
  20. _form = form;
  21. }
  22. /// <summary>
  23. ///
  24. /// </summary>
  25. /// <param name="ctrlContainer">panel 控件</param>
  26. public void InitControlsInfo(Control ctrlContainer)
  27. {
  28. if (ctrlContainer.Parent == _form)//获取窗体的高度和宽度
  29. {
  30. formOriginalWidth = Convert.ToDouble(ctrlContainer.Width);
  31. formOriginalHeight = Convert.ToDouble(ctrlContainer.Height);
  32. }
  33. foreach (Control item in ctrlContainer.Controls)
  34. {
  35. if (item.Name.Trim() != "")
  36. {
  37. //添加信息:键值:控件名,内容:据左边距离,距顶部距离,控件宽度,控件高度,控件字体。
  38. ControlsInfo.Add(item.Name, (item.Left + item.Width / ) + "," + (item.Top + item.Height / ) + "," + item.Width + "," + item.Height + "," + item.Font.Size);
  39. }
  40. if ((item as UserControl) == null && item.Controls.Count > )
  41. {
  42. InitControlsInfo(item);
  43. }
  44. }
  45.  
  46. }
  47.  
  48. public void FormSizeChanged()
  49. {
  50. if (ControlsInfo.Count > )//如果字典中有数据,即窗体改变
  51. {
  52. ControlsZoomScale(_form.Controls[]);//表示pannel控件
  53. ControlsChange(_form.Controls[]);
  54.  
  55. }
  56. }
  57. private void ControlsZoomScale(Control ctrlContainer)
  58. {
  59. scaleX = (Convert.ToDouble(ctrlContainer.Width) / formOriginalWidth);
  60. scaleY = (Convert.ToDouble(ctrlContainer.Height) / formOriginalHeight);
  61. }
  62.  
  63. /// <summary>
  64. /// 改变控件大小
  65. /// </summary>
  66. /// <param name="ctrlContainer"></param>
  67. private void ControlsChange(Control ctrlContainer)
  68. {
  69. double[] pos = new double[];//pos数组保存当前控件中心Left,Top,控件Width,控件Height,控件字体Size
  70. foreach (Control item in ctrlContainer.Controls)//遍历控件
  71. {
  72. if (item.Name.Trim() != "")//如果控件名不是空,则执行
  73. {
  74. if ((item as UserControl) == null && item.Controls.Count > )//如果不是自定义控件
  75. {
  76. ControlsChange(item);//循环执行
  77. }
  78. string[] strs = ControlsInfo[item.Name].Split(',');//从字典中查出的数据,以‘,’分割成字符串组
  79.  
  80. for (int i = ; i < ; i++)
  81. {
  82. pos[i] = Convert.ToDouble(strs[i]);//添加到临时数组
  83. }
  84. double itemWidth = pos[] * scaleX; //计算控件宽度,double类型
  85. double itemHeight = pos[] * scaleY; //计算控件高度
  86. item.Left = Convert.ToInt32(pos[] * scaleX - itemWidth / );//计算控件距离左边距离
  87. item.Top = Convert.ToInt32(pos[] * scaleY - itemHeight / );//计算控件距离顶部距离
  88. item.Width = Convert.ToInt32(itemWidth);//控件宽度,int类型
  89. item.Height = Convert.ToInt32(itemHeight);//控件高度
  90. item.Font = new Font(item.Font.Name, float.Parse((pos[] * Math.Min(scaleX, scaleY)).ToString()));//字体
  91.  
  92. }
  93. }
  94.  
  95. }
  96.  
  97. }
  98. }

使用:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10.  
  11. namespace WindowsFormsApp2
  12. {
  13. public partial class Form1 : Form
  14. {
  15.  
  16. AutoAdaptWindowsSize autoAdaptSize;
  17. public Form1()
  18. {
  19. InitializeComponent();
  20. #region 窗体缩放
  21. autoAdaptSize = new AutoAdaptWindowsSize(this);
  22. autoAdaptSize.InitControlsInfo(this.Controls[]);
  23. #endregion
  24. }
  25.  
  26. private void Form1_Load(object sender, EventArgs e)
  27. {
  28.  
  29. }
  30. #region 窗体缩放
  31.  
  32. private void Form1_SizeChanged(object sender, EventArgs e)
  33. {
  34. if (autoAdaptSize != null)
  35. {
  36. autoAdaptSize.FormSizeChanged();
  37. }
  38. }
  39.  
  40. #endregion
  41.  
  42. }
  43. }

C#winform 窗体缩放自适应的更多相关文章

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

    C# winform中 窗体缩放自适应的方法(不同电脑/不同分辨率)   窗体缩放是一个困扰我多时的问题,为了解决这个问题,我从网上找了很多相关的资料,很多人说用Anchor和Dock属性,但是我试了 ...

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

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

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

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

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

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

  5. WinForm窗体自适应分辨率

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

  6. C# WinForm窗体及其控件自适应各种屏幕分辨率

    C# WinForm窗体及其控件自适应各种屏幕分辨率 一.说明  我们自己编写程序的界面,会遇到各种屏幕分辨率,只有自适应才能显的美观.实际上,做到这点也很简单,就是首先记录窗体和它上面控件的初始位置 ...

  7. Winform中使用控件的Dock属性设计窗体布局,使不随窗体缩放而改变

    场景 在新建一个Winform窗体后,拖拽控件设置其布局如下 如果只是单纯的这么设计,我们在运行后,如果对窗口进行缩放就会导致如下 所以我们需要在设计页面布局时对控件进行定位设置. 注: 博客主页:h ...

  8. 解决Delphi窗体缩放の疑难杂症

    http://anony3721.blog.163.com/blog/static/511974201082235754423/ 解决Delphi窗体缩放の疑难杂症 2010-09-22 15:57: ...

  9. winform 窗体圆角设计

    网上看到的很多winform窗体圆角设计代码都比较累赘,这里分享一个少量代码就可以实现的圆角.主要运用了System.Drawing.Drawing2D. 效果图 代码如下. private void ...

随机推荐

  1. Cannot make a static reference to the non-static

    public class SeckillServiceImpl implements SeckillService{ private SeckillDao seckillDao; private Su ...

  2. ArcGis Python脚本——根据字段内容拆分要素类(shp)为多个

    其实,这就是批量执行了ArcToolbox 分析工具-筛选 功能. 先上代码,后做解说: # in_feature:待拆分要素类 # out_folderpath:输出路径,注意最后加“/”以与字段名 ...

  3. 细说log4j之概述

    log4j官网:https://logging.apache.org/ log4j目前存在2个版本:log4j 1.x 和log4j 2.x,目前官方主推2.x版本(log4j 1.x已于2015.0 ...

  4. linux大法好。。。。。

    vim: 移动光标至段首:^或者home键 移动光标至段尾:$或者end键 删除光标位置到本行开头:d0或者d^ 删除光标位置到本行末尾:D或者d$ 撤销操作:u 取消撤销操作:ctrl+r ---- ...

  5. 使用JAVA数组实现顺序表

    1,引入了JAVA泛型类,因此定义了一个Object[] 类型的数组,从而可以保存各种不同类型的对象. 2,默认构造方法创建了一个默认大小为16的Object数组:带参数的构造方法创建一个指定长度的O ...

  6. PS 使用笔记 - PS 让工作台适应 当前图层

    1.  PS 让工作台适应  当前图层 选中图层  打开 [图像]=>[裁切] 勾选以下,确定即可

  7. 01.Redis 初体验

    0. Redis安装 官网下载Redis 解压缩 make make install 安装后的执行命令被保存在了/usr/local/bin目录下 1. 配置文件:redis.conf daemoni ...

  8. UDP客户/服务器程序所用的套接字函数

  9. SSH整合方案二(不带hibernate.cfg.xml)

    整体结构: 1.引入相关jar包 2.编写实体类和映射文件 package cn.zqr.domain; public class Customer { private Long cust_id; p ...

  10. luogu 3045 优先队列反悔/bzoj 2590

    N头奶牛,价格Pi,K张优惠券,优惠券购买降为Ci,不超过M的钱最多可买多少奶牛 先将c值k小的加入,将它们省下的钱加入优先队列(省下的钱由少到多),在将k+1-n用p排序,再逐个与优先队列中弹出的比 ...