C#自适应窗体控件大小

目录

  • 一、源码展示:
  • 二、分析代码:
      • 1、创建一个controlRect对象
      • 2、创建一个对象数组List < controlRect > oldCtrl
      • 3、创建用来记录控件的默认位置和大小的方法
      • 4、创建一个用于嵌套记录控件默认位置和大小的方法
      • 5、创建控件自适应大小的方法
      • 6、创建用于嵌套等比例控件的方法
      • 7、在其中方法还需要再判断一个
      • 8、调用方法
    • 分析代码中五步被我简化,与源代码有些区别。
  • 三、运行结果:
        • 区别:

一、源码展示:

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中,第一次改变大小时,记录控件原始的大小和位置
            这里所有控件的子控件都已经形成
        */

         

你可能感兴趣的:(#包装机,C#,c#,winform)