简单是实现winform控件随窗体的大小改变而改变(坐标+大小)

来源:互联网 发布:js image onload 编辑:程序博客网 时间:2024/05/25 08:13

       

着急写的不用Anchor和Dock实现的一个关于窗体控件随窗体大小改变的代码.  命名有点不规范..  哪里写的不好.还请各位大神批评哈..嘿嘿

/// <summary>
        /// 帮助类.用于保存第一次加载时的控件的坐标和宽度
        /// </summary>
        public class hp
        {
            public Size s { set; get; }
            public Point p { set; get; }
        }
        /// <summary>
        /// 字典.用于保存每个控件的名字.和每个控件的帮助类
        /// </summary>
        Dictionary<string, hp> dictMain = new Dictionary<string, hp>();

        /// <summary>
        /// 设置宽度初始化事件
        /// </summary>
        /// <param name="fm">窗体 </param>
        public void SetSize(Form fm)
        {
           //实例化帮助类.保存当前窗体的宽度.
            hp hf = new hp();
            hf.s = fm.Size;
            dictMain.Add(fm.Name, hf);

            //遍历每个控件的宽度
            foreach (Control c in this.Controls)
            {

                hp h = new hp();
                h.p = c.Location;//坐标
                h.s = c.Size;//宽度
                dictMain.Add(c.Name, h);//保存
            }
            //注册事件
            fm.SizeChanged += new EventHandler(fm_SizeChanged);
        }

        //窗体size改变时
        void fm_SizeChanged(object sender, EventArgs e)
        {
            //获取窗体.以及改变后的窗体的Size
            Form fm = sender as Form;
            Size s = fm.Size;

            if (!dictMain.Keys.Contains(fm.Name))
            {
                return;
            }
            //获取第一次的size
            Size size = dictMain[fm.Name].s;

            //获取控件改变比例的精度
            Double dw = (double)s.Width / size.Width;
            double dh = (double)s.Height / size.Height;

            //遍历每个控件
            foreach (Control c in this.Controls)
            {
                //如果含有当前控件
                if (dictMain.Keys.Contains(c.Name))
                {
                    //获取第一次加载时控件的坐标以及大小
                    hp h = dictMain[c.Name];
                    Point np = h.p;
                    Size nz = h.s;

                    //重新得到乘以精度后的X,Y,宽,高
                    np.X = Convert.ToInt32(np.X * dw);
                    np.Y = Convert.ToInt32(np.Y * dh);
                    nz.Width = Convert.ToInt32(nz.Width * dw);
                    nz.Height = Convert.ToInt32(nz.Height * dh);

                    //重新赋值
                    c.Location = np;
                    c.Size = nz;

                }
            }
        }


<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击