C#From窗体改变后控件自适应代码,可自动改变控件中的控件及字体大小
//长话短说 //大家互相交流,有不足处请指正
//此代码设计思路:记录初始的Form的宽度与高度,每次更改后算出比例,然后再等比例设置所有控件的Top,Left,Width,Heigh,及字体的大小更改
//字体大小更改关键字:自动更改字体的大小 //2020-03-23 19:21:50 更新
//可搜关键字://核心代码
//整个源代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace FormResize
{
public partial class Form1 : Form
{
//
/// 窗体改变前的Width宽度
///
private int iForm_ResizeBefore_Width;
///
/// 窗体改变前的Height高度
///
private int iForm_ResizeBefore_Height;
///
/// 取得Form中控件中初始的字体大小,即无论Form多大此字体都是Form中最小值
///
private float FontSizeMin = 0; //2020-03-23 19:21:50 更新
///
/// 宽比例,float类型,此处为每次改后窗体的宽度 除以改变前窗体的宽度的比例
///
private float fRatio_Width;
///
/// 高比例,float类型,此处为每次改后窗体的高度 除以改变前窗体的高度的比例
///
private float fRatio_Height;
public Form1()
{
InitializeComponent();
//代码增加ResizeEnd事件 //也可通过设计器增加ResizeEnd事件然后删掉此处代码
this.ResizeEnd += new System.EventHandler(this.Form1_ResizeEnd);
//设置最小大小为窗体打开的初始大小
this.MinimumSize = this.Size;
//取得Form中控件中初始的字体大小 //若此From中字体不统一,则此处为数组。
FontSizeMin = this.button1.Font.Size; //2020-03-23 19:21:50 更新
//获得窗体改变前的Form的宽度与高度 //赋初始值
iForm_ResizeBefore_Width = this.Size.Width;
iForm_ResizeBefore_Height = this.Size.Height;
}
private void Form1_ResizeEnd(object sender, EventArgs e) //窗体改变后发生的事件
{
//窗体改变后Form的宽度与高度及宽比例和高比例
fRatio_Width = (this.Size.Width / (float)iForm_ResizeBefore_Width);
fRatio_Height = (this.Size.Height / (float)iForm_ResizeBefore_Height);
AutoResize(this); //2019-3-21 10:50:42更新
////获得下一次窗体改变前的Form的宽度与高度
iForm_ResizeBefore_Width = this.Size.Width;
iForm_ResizeBefore_Height = this.Size.Height;
}
//
/// 自适应窗体大小的方法,递归
///
///
private void AutoResize(Control theControl) //核心代码
{
#region 控制控件自适应UI大小
foreach (Control OneCon in theControl.Controls) //根据原大小等比例放大
{
OneCon.Left = Convert.ToInt32((OneCon.Left * fRatio_Width));
OneCon.Top = Convert.ToInt32((OneCon.Top * fRatio_Height));
OneCon.Width = Convert.ToInt32(OneCon.Width * fRatio_Width);
OneCon.Height = Convert.ToInt32(OneCon.Height * fRatio_Height);
if (OneCon.Controls.Count > 0)
{
AutoResize(OneCon);//如Form内还有控件中的控件,此处则可递归改变大小,此处为重点中的重点 //2019-3-21 10:50:42更新
}
#region 自动更改字体的大小 //2020-03-23 19:21:50 更新
// 当前控件(OneCon.Font.Size) 乘以(8) 长宽比例中最小值 (Math.Min(fRatio_Width, fRatio_Height)
//Math.Round(数值, 2) //保留两位有效数字
float currentSize = float.Parse(Math.Round(OneCon.Font.Size * (Math.Min(fRatio_Width, fRatio_Height)), 2).ToString());
if (currentSize > FontSizeMin)
OneCon.Font = new Font(OneCon.Font.Name, currentSize, OneCon.Font.Style, OneCon.Font.Unit);
else
OneCon.Font = new Font(OneCon.Font.Name, FontSizeMin, OneCon.Font.Style, OneCon.Font.Unit);
//某种程度上来说 if 语句都可以改成三目运算符, 举例: m=a>b?a:b; 表示先判断a是否大于b,若a>b,则将a的值赋给m,若不符合a>b,则将b的值赋给m
//float NowSize = currentSize > FontSizeMin ? currentSize : FontSizeMin;
//OneCon.Font = new Font(OneCon.Font.Name, NowSize, OneCon.Font.Style, OneCon.Font.Unit);
#endregion
}
#endregion
}
}
}
备注:1.Form显示时可以调整到的最小的大小,代码-> this.MinimumSize = this.Size; //2019-1-25 10:29:24更新
2.修改代码 使之可以改变控件中的控件的大小//2019-3-21 20:50:42更新
3.新增变量FontSizeMin来确认自动更改字体的大小,//2020-03-23 19:21:50 更新
4.源代码下载地址:(https://download.csdn.net/download/shengmingzaiyuxuexi/12264681)(或者私信我要源码也可)
5.代码可能不够缜密,如何优化,请指出
如有错误,请指正
如有疑问,请留言
如想提携,请私信
与君共勉,共同进步!
编译环境:Visual studio 2012
编译语言:C#