目录
一、源码展示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
//1、先记录窗体和控件初始的位置和大小
//2、将新窗体和老窗体相除等到一个比例值
//3、将这个比例值给与老窗体的控件位置和大小相乘
//4、需要考虑控件里还有控件的情况,需要定义一个方法用于嵌套调用
namespace WindowsFormsApp1
{
class Class1
{
//1.声明结构,只记录窗体和控件的初始位置和大小
//创建一个对象
public struct controlRect
{
//确定好左边和顶部的距离以及高度和宽度,就确定了这个窗体的位置和大小了
public int Left;
public int Top;
public int Width;
public int Height;
}
//2.创建一个对象数组
public List<controlRect> oldCtrl = new List<controlRect>();
//定义序号
int ctrlNo = 0;
//3.创建两个函数
//3.1记录窗体和其控件的初始位置和大小
public void MoRenWeiZhi(Control mForm)
{
//实例化对象
controlRect cR;
//将窗体的位置和大小保存到对象中
cR.Left = mForm.Left;
cR.Top = mForm.Top;
cR.Width = mForm.Width;
cR.Height = mForm.Height;
//将存储窗体参数的对象保存到数组中,第一个就是初始窗体本身
oldCtrl.Add(cR);
//调用嵌套方法(往下看)
AddControl(mForm);
}
//定义一个递归调用的方法(嵌套方法)
private void AddControl(Control ctl)
{
//如果这个控件里还有嵌套的控件的话,就执行foreach内的语句
foreach(Control c in ctl.Controls)
{
//先创建一个对象
controlRect objCtrl;
//将嵌套控件的参数传入对象
objCtrl.Top = c.Top;
objCtrl.Left = c.Left;
objCtrl.Height = c.Height;
objCtrl.Width = c.Width;
//将存储参数的对象放到数组里
oldCtrl.Add(objCtrl);
//如果控件里的有一个嵌套控价,而嵌套控件里还有嵌套控件,则继续递归
if (c.Controls.Count > 0)
{
//嵌套控件里的嵌套控件
AddControl(c);
}
}
}
//控件自适应大小
public void AutoSize(Control mForm)
{
if (ctrlNo == 0)
{
/* 如果在窗体的Form1_Load中,记录控件原始的大小和位置,正常没有问题,
但要加入皮肤就会出现问题
因为有些控件如dataGridView的的子控件还没有完成,个数少
要在窗体的Form1_SizeChanged中,第一次改变大小时,记录控件原始的大小和位置
这里所有控件的子控件都已经形成
*/
//实例化对象
controlRect cR;
//初始化窗体
cR.Left = 0;
cR.Top = 0;
cR.Width = mForm.PreferredSize.Width;
cR.Height = mForm.PreferredSize.Height