• Winform 窗体控件+字体自适应屏幕大小


    AutoSizeFormClass类:

    public class AutoSizeFormClass
        {
            /// <summary>
            /// 声明结构 记录控件位置和大小
            /// </summary>
            public struct ControlRect
            {
                public int Left;
                public int Top;
                public int Width;
                public int Height;
                public float Size;
            }
    
            public List<ControlRect> _oldCtrl = new List<ControlRect>();
            private int _ctrlNo = 0;
    
            private void AddControl(Control ctrl)
            {
                foreach (Control c in ctrl.Controls)
                {
                    ControlRect cR;
                    cR.Left = c.Left;
                    cR.Top = c.Top;
                    cR.Width = c.Width;
                    cR.Height = c.Height;
                    cR.Size = c.Font.Size;
                    _oldCtrl.Add(cR);
                    // 控件可能嵌套子控件
                    if (c.Controls.Count > 0)
                        AddControl(c);
                }
            }
    
            public void ControlAutoSize(Control mForm)
            {
                if (_ctrlNo == 0)
                {
                    ControlRect cR;
                    cR.Left = mForm.Left;
                    cR.Top = mForm.Top;
                    cR.Width = mForm.Width;
                    cR.Height = mForm.Height;
                    cR.Size = mForm.Font.Size;
                    _oldCtrl.Add(cR);
    
                    AddControl(mForm);
                }
    
                _ctrlNo = 1;
                float wScale = (float)mForm.Width / _oldCtrl[0].Width;
                float hScale = (float)mForm.Height / _oldCtrl[0].Height;
                AutoScaleControl(mForm, wScale, hScale);
            }
    
            private void AutoScaleControl(Control mForm, float wScale, float hScale)
            {
                int ctrlLeft, ctrlTop, ctrlWidth, ctrlHeight;
                float ctrlFontSize, hSize, wSize;
                foreach (Control c in mForm.Controls)
                {
                    ctrlLeft = _oldCtrl[_ctrlNo].Left;
                    ctrlTop = _oldCtrl[_ctrlNo].Top;
                    ctrlWidth = _oldCtrl[_ctrlNo].Width;
                    ctrlHeight = _oldCtrl[_ctrlNo].Height;
                    ctrlFontSize = _oldCtrl[_ctrlNo].Size;
    
                    c.Left = (int)Math.Ceiling(ctrlLeft * wScale);
                    c.Top = (int)Math.Ceiling(ctrlTop * hScale);
                    c.Width = (int)Math.Ceiling(ctrlWidth * wScale);
                    c.Height = (int)Math.Ceiling(ctrlHeight * hScale);
    
                    wSize = ctrlFontSize * wScale;
                    hSize = ctrlFontSize * hScale;                
                    c.Font = new Font(c.Font.Name, Math.Min(hSize, wSize), c.Font.Style, c.Font.Unit);
    
                    _ctrlNo++;
    
                    // 先缩放控件本身 再缩放子控件
                    if (c.Controls.Count > 0)
                    {
                        AutoScaleControl(c, wScale, hScale);
                    }
                }
            }
        }

    MainFrom中添加:

            AutoSizeFormClass asc = new AutoSizeFormClass();        
    
            private void MainForm_SizeChanged(object sender, EventArgs e)
            {
                asc.ControlAutoSize(this);
            }
  • 相关阅读:
    利用crontab每天定时备份MySQL数据库
    MySQL基本SQL语句之数据插入、删除数据和更新数据
    Vim命令合集
    ubuntu下手动安装php-amqp模块教程
    变量作用域(总结篇)
    变量作用域(示例篇)
    定义一个函数
    正则表达式
    re模块中常用功能函数
    python内置函数
  • 原文地址:https://www.cnblogs.com/zhengzc/p/8966102.html
Copyright © 2020-2023  润新知