C#窗口控件大小随窗口大小而改变

时间:2021-08-06 03:48:12

自己写了个类,可以实现窗口大小发生改变时,窗口内的控件大小也随之改变(等比例),

不过调用要有点小技巧,后面再说,类的代码如

    /// <summary>
    /// 窗口控件大小变化随窗口等比变化
    /// </summary>
    public class MyResize
    { /// <summary>
      /// 记录改变前窗口的大小
      /// </summary>
        Size originalSize;
        /// <summary>
        /// 记录改变前窗口的大小
        /// </summary>
        public Size OriginalSize { get => originalSize; set => originalSize = value; }
        /// <summary>
        /// 在水平方向上的比例
        /// </summary>
        float Xratio = 1;
        /// <summary>
        /// 在垂直方向上的比例
        /// </summary>
        float Yratio = 1;

        /// <summary>
        /// MyResize类实例化
        /// </summary>
        public MyResize(Form f)
        {
            OriginalSize = f.Size;
        }
        private MyResize()
        {
            ///不允许无参构造
        }
        /// <summary>
        /// 根据窗口大小,自动调整控件大小,不支持容器的子控件!
        /// </summary>
        /// <param name="f1">要调整的窗口</param>
        /// <returns></returns>
        public void Resize(Form f1)
        {
            Xratio = (float)f1.Size.Width / (float)originalSize.Width;
            Yratio = (float)f1.Size.Height / (float)originalSize.Height;
            foreach (Control a in f1.Controls)
            {
                a.Size = new Size((int)(a.Size.Width * Xratio), (int)(a.Size.Height * Yratio));
                a.Location = new Point((int)(a.Location.X * Xratio), (int)(a.Location.Y * Yratio));
            }
            originalSize = f1.Size;
        }
调用的话,声明应该要声明全局的,但实例化要在函数内,一般可以在构造函数中,也可以在窗口的Load事件中都行,但声明的时候不能直接实例化(当然,如果你能在方法外使用this关键字的话可能就可以),下面是一个调用的例子:

C#窗口控件大小随窗口大小而改变


TP:为了方便使用,我将它弄成了类库(虽然只是有个类 — . —)。