C#winform 窗体缩放自适应
1. 首先在窗体上放上一个Panel容器,并将容器的Dock属性设为Fill,即所有的控件都放在了这个容器里。
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.Text;
- using System.Windows.Forms;
- namespace WindowsFormsApp2
- {
- class AutoAdaptWindowsSize
- {
- double formOriginalWidth;//窗体原始宽度
- double formOriginalHeight;//窗体原始高度
- double scaleX;//水平缩放比例
- double scaleY;//垂直缩放比例
- Dictionary<string, string> ControlsInfo = new Dictionary<string, string>();//控件中心Left,Top,控件Width,控件Height,控件字体Size
- private Form _form;
- public AutoAdaptWindowsSize(Form form)
- {
- _form = form;
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="ctrlContainer">panel 控件</param>
- public void InitControlsInfo(Control ctrlContainer)
- {
- if (ctrlContainer.Parent == _form)//获取窗体的高度和宽度
- {
- formOriginalWidth = Convert.ToDouble(ctrlContainer.Width);
- formOriginalHeight = Convert.ToDouble(ctrlContainer.Height);
- }
- foreach (Control item in ctrlContainer.Controls)
- {
- if (item.Name.Trim() != "")
- {
- //添加信息:键值:控件名,内容:据左边距离,距顶部距离,控件宽度,控件高度,控件字体。
- ControlsInfo.Add(item.Name, (item.Left + item.Width / ) + "," + (item.Top + item.Height / ) + "," + item.Width + "," + item.Height + "," + item.Font.Size);
- }
- if ((item as UserControl) == null && item.Controls.Count > )
- {
- InitControlsInfo(item);
- }
- }
- }
- public void FormSizeChanged()
- {
- if (ControlsInfo.Count > )//如果字典中有数据,即窗体改变
- {
- ControlsZoomScale(_form.Controls[]);//表示pannel控件
- ControlsChange(_form.Controls[]);
- }
- }
- private void ControlsZoomScale(Control ctrlContainer)
- {
- scaleX = (Convert.ToDouble(ctrlContainer.Width) / formOriginalWidth);
- scaleY = (Convert.ToDouble(ctrlContainer.Height) / formOriginalHeight);
- }
- /// <summary>
- /// 改变控件大小
- /// </summary>
- /// <param name="ctrlContainer"></param>
- private void ControlsChange(Control ctrlContainer)
- {
- double[] pos = new double[];//pos数组保存当前控件中心Left,Top,控件Width,控件Height,控件字体Size
- foreach (Control item in ctrlContainer.Controls)//遍历控件
- {
- if (item.Name.Trim() != "")//如果控件名不是空,则执行
- {
- if ((item as UserControl) == null && item.Controls.Count > )//如果不是自定义控件
- {
- ControlsChange(item);//循环执行
- }
- string[] strs = ControlsInfo[item.Name].Split(',');//从字典中查出的数据,以‘,’分割成字符串组
- for (int i = ; i < ; i++)
- {
- pos[i] = Convert.ToDouble(strs[i]);//添加到临时数组
- }
- double itemWidth = pos[] * scaleX; //计算控件宽度,double类型
- double itemHeight = pos[] * scaleY; //计算控件高度
- item.Left = Convert.ToInt32(pos[] * scaleX - itemWidth / );//计算控件距离左边距离
- item.Top = Convert.ToInt32(pos[] * scaleY - itemHeight / );//计算控件距离顶部距离
- item.Width = Convert.ToInt32(itemWidth);//控件宽度,int类型
- item.Height = Convert.ToInt32(itemHeight);//控件高度
- item.Font = new Font(item.Font.Name, float.Parse((pos[] * Math.Min(scaleX, scaleY)).ToString()));//字体
- }
- }
- }
- }
- }
使用:
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- namespace WindowsFormsApp2
- {
- public partial class Form1 : Form
- {
- AutoAdaptWindowsSize autoAdaptSize;
- public Form1()
- {
- InitializeComponent();
- #region 窗体缩放
- autoAdaptSize = new AutoAdaptWindowsSize(this);
- autoAdaptSize.InitControlsInfo(this.Controls[]);
- #endregion
- }
- private void Form1_Load(object sender, EventArgs e)
- {
- }
- #region 窗体缩放
- private void Form1_SizeChanged(object sender, EventArgs e)
- {
- if (autoAdaptSize != null)
- {
- autoAdaptSize.FormSizeChanged();
- }
- }
- #endregion
- }
- }
C#winform 窗体缩放自适应的更多相关文章
- C# winform中 窗体缩放自适应的方法(不同电脑/不同分辨率)
C# winform中 窗体缩放自适应的方法(不同电脑/不同分辨率) 窗体缩放是一个困扰我多时的问题,为了解决这个问题,我从网上找了很多相关的资料,很多人说用Anchor和Dock属性,但是我试了 ...
- WinForm窗体及其控件的自适应
3步骤: 1.在需要自适应的Form中实例化全局变量 AutoSizeFormClass.cs源码在下方 AutoSizeFormClass asc = new AutoSizeFormClass ...
- 转:C# WinForm窗体及其控件的自适应
一.说明 2012-11-30 曾经写过 <C# WinForm窗体及其控件自适应各种屏幕分辨率> ,其中也讲解了控件自适应的原理.近期有网友说,装在panel里面的控件,没有效果? 这 ...
- Winform窗体控件自适应大小
自己写的winform窗体自适应大小代码,代码比较独立,很适合贴来贴去不会对原有程序造成影响,可以直接继承此类或者把代码复制到自己的代码里面直接使用 借鉴了网上的一些资料,最后采用重写WndProc方 ...
- WinForm窗体自适应分辨率
我们自己编写程序的界面,会遇到各种屏幕分辨率,只有自适应才能显的美观.实际上,做到这点也很简单,就是首先记录窗体和它上面控件的初始位置和大小,当窗体改变比例时,其控件的位置和大小也按此比例变化即可.因 ...
- C# WinForm窗体及其控件自适应各种屏幕分辨率
C# WinForm窗体及其控件自适应各种屏幕分辨率 一.说明 我们自己编写程序的界面,会遇到各种屏幕分辨率,只有自适应才能显的美观.实际上,做到这点也很简单,就是首先记录窗体和它上面控件的初始位置 ...
- Winform中使用控件的Dock属性设计窗体布局,使不随窗体缩放而改变
场景 在新建一个Winform窗体后,拖拽控件设置其布局如下 如果只是单纯的这么设计,我们在运行后,如果对窗口进行缩放就会导致如下 所以我们需要在设计页面布局时对控件进行定位设置. 注: 博客主页:h ...
- 解决Delphi窗体缩放の疑难杂症
http://anony3721.blog.163.com/blog/static/511974201082235754423/ 解决Delphi窗体缩放の疑难杂症 2010-09-22 15:57: ...
- winform 窗体圆角设计
网上看到的很多winform窗体圆角设计代码都比较累赘,这里分享一个少量代码就可以实现的圆角.主要运用了System.Drawing.Drawing2D. 效果图 代码如下. private void ...
随机推荐
- Cannot make a static reference to the non-static
public class SeckillServiceImpl implements SeckillService{ private SeckillDao seckillDao; private Su ...
- ArcGis Python脚本——根据字段内容拆分要素类(shp)为多个
其实,这就是批量执行了ArcToolbox 分析工具-筛选 功能. 先上代码,后做解说: # in_feature:待拆分要素类 # out_folderpath:输出路径,注意最后加“/”以与字段名 ...
- 细说log4j之概述
log4j官网:https://logging.apache.org/ log4j目前存在2个版本:log4j 1.x 和log4j 2.x,目前官方主推2.x版本(log4j 1.x已于2015.0 ...
- linux大法好。。。。。
vim: 移动光标至段首:^或者home键 移动光标至段尾:$或者end键 删除光标位置到本行开头:d0或者d^ 删除光标位置到本行末尾:D或者d$ 撤销操作:u 取消撤销操作:ctrl+r ---- ...
- 使用JAVA数组实现顺序表
1,引入了JAVA泛型类,因此定义了一个Object[] 类型的数组,从而可以保存各种不同类型的对象. 2,默认构造方法创建了一个默认大小为16的Object数组:带参数的构造方法创建一个指定长度的O ...
- PS 使用笔记 - PS 让工作台适应 当前图层
1. PS 让工作台适应 当前图层 选中图层 打开 [图像]=>[裁切] 勾选以下,确定即可
- 01.Redis 初体验
0. Redis安装 官网下载Redis 解压缩 make make install 安装后的执行命令被保存在了/usr/local/bin目录下 1. 配置文件:redis.conf daemoni ...
- UDP客户/服务器程序所用的套接字函数
- SSH整合方案二(不带hibernate.cfg.xml)
整体结构: 1.引入相关jar包 2.编写实体类和映射文件 package cn.zqr.domain; public class Customer { private Long cust_id; p ...
- luogu 3045 优先队列反悔/bzoj 2590
N头奶牛,价格Pi,K张优惠券,优惠券购买降为Ci,不超过M的钱最多可买多少奶牛 先将c值k小的加入,将它们省下的钱加入优先队列(省下的钱由少到多),在将k+1-n用p排序,再逐个与优先队列中弹出的比 ...