zoukankan      html  css  js  c++  java
  • C#实现窗口拖动时各个控件同比自己主动放缩大小

    实现方式主要是利用panel控件为主题。对于每一个控件的大小位置和字体这几个属性进行记录。

    然后依据窗口改变的大小同一时候放缩。


    简要过程例如以下:

    1 创建C#窗口程序项目。

    2  Panel放置到窗口。

    3  设置属性dock为fill。

    4  注意MinnumSize不能设置为0, 改成大于0都行。

    public partial class FrmDemo : Form
        {
            double dFrmWidth;
            double dFrmHeight;
            double dZoomHorizon;
            double dZoomVerticality;
            Dictionary<string, string> dicControlsAttribute = new Dictionary<string, string>();
    
            protected void GetAllInitiateContrlInfo(Control CrlContainer)
            {
                if (CrlContainer.Parent == this)
                {
                    dFrmWidth = Convert.ToDouble(CrlContainer.Width);
                    dFrmHeight = Convert.ToDouble(CrlContainer.Height);
                }
                foreach (Control item in CrlContainer.Controls)
                {
                    if (item.Name.Trim() != "")
                        dicControlsAttribute.Add(item.Name, (item.Left + item.Width / 2) + "," + (item.Top + item.Height / 2) 
                                                 + "," + item.Width + "," + item.Height + "," + item.Font.Size);
                    if ((item as UserControl) == null && item.Controls.Count > 0)
                        GetAllInitiateContrlInfo(item);
                }
            }
    
            private void ChangeControlsInitiate(Control CrlContainer)
            {
                dZoomHorizon = (Convert.ToDouble(CrlContainer.Width) / dFrmWidth);
                dZoomVerticality = (Convert.ToDouble(CrlContainer.Height) / dFrmHeight);
            }
            
            private void ChangeCurrentControlAttr(Control CrlContainer)
            {
                double[] dPosition = new double[5];
                foreach (Control item in CrlContainer.Controls)
                {
                    if (item.Name.Trim() != "")
                    {
                        if ((item as UserControl) == null && item.Controls.Count > 0)
                            ChangeCurrentControlAttr(item);
                        string[] strs = dicControlsAttribute[item.Name].Split(',');
                        for (int j = 0; j < 5; j++)
                        {
                            dPosition[j] = Convert.ToDouble(strs[j]);
                        }
                        double itemWidth = dPosition[2] * dZoomHorizon;
                        double itemHeight = dPosition[3] * dZoomVerticality;
                        item.Left = Convert.ToInt32(dPosition[0] * dZoomHorizon - itemWidth / 2);
                        item.Top = Convert.ToInt32(dPosition[1] * dZoomVerticality - itemHeight / 2);
                        item.Width = Convert.ToInt32(itemWidth);
                        item.Height = Convert.ToInt32(itemHeight);
                        //item.Font = new Font(item.Font.Name, float.Parse
                        //((dPosition[4] * Math.Min(dZoomHorizon, dZoomVerticality)).ToString()));
                        //字体也能够实现同比放缩。
                         }
                }
            }
            protected override void OnSizeChanged(EventArgs e)
            {
                base.OnSizeChanged(e);
                if (dicControlsAttribute.Count > 0)
                {
                    ChangeControlsInitiate(this.Controls[0]);
                    ChangeCurrentControlAttr(this.Controls[0]);
                }
            } 
    
            public FrmDemo()
            {
                InitializeComponent();
                GetAllInitiateContrlInfo(this.Controls[0]);//构造函数里面调用就可以。
            }
    }
    

    5 效果測试






  • 相关阅读:
    GB/T 38879-2020 颗粒 粒度分析 彩色图像分析法
    GB/T 30431-2020 实验室气相色谱仪
    GB/T 50165-2020 古建筑木结构维护与加固技术标准
    GB/T 51405-2019 船厂总体设计标准
    GB/T 38922-2020 35kV及以下标准化继电保护装置通用技术要求
    GB/T 38953-2020 微电网继电保护技术规定
    GB/T 38886-2020 高温轴承钢等最新国家标准(2020-6-19)
    pytest_02(使用pychar执行pytest)
    pytest-01(安装pytest及运行规则)
    python-05(关于map函数的使用)
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7018236.html
Copyright © 2011-2022 走看看