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






  • 相关阅读:
    Redis源码剖析(十一)AOF持久化
    Redis源码剖析(一)内存管理zmalloc
    Redis源码剖析(七)压缩列表
    PHP基础课程学习总结
    php标记,变量,常量
    内容控件
    WPF 面板
    OpenSSL SSL_read: Connection was reset, errno 10054
    Java Web 项目学习(三) 发布帖子 AJAX
    控件类(ControlAndFont)
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7018236.html
Copyright © 2011-2022 走看看