首页 > 代码库 > C#实现窗体拖动时各个控件同比自动放缩大小

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 效果测试