walk along at the far from top

沙尘里的世界

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

/// <summary>
    /// 此类可以实现窗体的随意缩放保持内部控件的相对位置
    /// </summary>
    public class AutoSizedControllor
    {
        /// <summary>
        /// 控件布局类
        /// </summary>
        private class ControlLayout
        {
            public double WidthPresent, HeightPresent, TopPresent, LeftPresent;

            public ControlLayout(double top, double left, double width, double height)
            {
                WidthPresent = width;
                HeightPresent = height;
                TopPresent = top;
                LeftPresent = left;
            }
        }

        private Control parent;
        private System.Collections.Hashtable subControls = new System.Collections.Hashtable();

        /// <summary>
        /// 注册
        /// </summary>
        /// <param name="ctrl">容器控件</param>
        public void regist(Control vectorControl,bool registSubVectorControl)
        {
            //注册事件
            parent = vectorControl;
            parent.ControlAdded += new ControlEventHandler(ControlAdded);
            parent.ControlRemoved += new ControlEventHandler(ControlRemoved);
            parent.Resize += new EventHandler(Resize);

            //记录位置
            foreach (Control ctl in vectorControl.Controls)
            {
                if (registSubVectorControl && ctl.Controls.Count > 0)
                {
                    AutoSizedControllor subController = new AutoSizedControllor();
                    subController.regist(ctl,registSubVectorControl);
                }
                //                else
                //                {
                //                    if(rect.Width.ToString ( )=="800")
                //                    {       
                //                        subControls.Add(ctl,new ControlLayout(
                //                            (double)ctl.Top / 768, (double)ctl.Left / 1024,
                //                            (double)ctl.Width / 1024, (double)ctl.Height / 768));
                //                    }
                //                    else
                //                    {
                subControls.Add(ctl,new ControlLayout(
                    (double)ctl.Top / (double)parent.Height, (double)ctl.Left / (double)parent.Width,
                    (double)ctl.Width / (double)parent.Width, (double)ctl.Height / (double)parent.Height));
                //                    }
                //                }
            }
        }

        public void regist1(Control vectorControl,bool registSubVectorControl)
        {
            //注册事件
            parent = vectorControl;
            parent.ControlAdded += new ControlEventHandler(ControlAdded1);
            parent.ControlRemoved += new ControlEventHandler(ControlRemoved);
            parent.Resize += new EventHandler(Resize1);

            //记录位置
            foreach (Control ctl in vectorControl.Controls)
            {
                if (registSubVectorControl && ctl.Controls.Count > 0)
                {
                    AutoSizedControllor subController = new AutoSizedControllor();
                    subController.regist(ctl,registSubVectorControl);
                }           
                subControls.Add(ctl,new ControlLayout(
                    (double)ctl.Top / 768, (double)ctl.Left / 1024,
                    (double)ctl.Width / 1024, (double)ctl.Height / 768));               
            }
        }

        void Resize(object sender, EventArgs e)
        {
            int iCount = parent.Controls.Count;
            foreach(Control ctl in parent.Controls)
            {
                ctl.Left = (int)((subControls[ctl] as ControlLayout).LeftPresent * (double)parent.Width);
                //ctl.Top = (int)((subControls[ctl] as ControlLayout).TopPresent * (double)parent.Height);
                ctl.Width = (int)((subControls[ctl] as ControlLayout).WidthPresent * (double)parent.Width);
                //ctl.Height = (int)((subControls[ctl] as ControlLayout).HeightPresent * (double)parent.Height);
            }
        }

        void Resize1(object sender, EventArgs e)
        {
            int iCount = parent.Controls.Count;
            foreach(Control ctl in parent.Controls)
            {
                ctl.Left = (int)((subControls[ctl] as ControlLayout).LeftPresent * 800);
                ctl.Top = (int)((subControls[ctl] as ControlLayout).TopPresent * 600);
                ctl.Width = (int)((subControls[ctl] as ControlLayout).WidthPresent * 800);
                ctl.Height = (int)((subControls[ctl] as ControlLayout).HeightPresent * 600);
            }
        }

        void ControlAdded1(object sender, ControlEventArgs e)
        {       
            subControls.Add(e.Control, new ControlLayout(
                (double)e.Control.Top / 768, (double)e.Control.Left / 1024,
                (double)e.Control.Width / 1024, (double)e.Control.Height / 768));
        }

        void ControlAdded(object sender, ControlEventArgs e)
        {
            subControls.Add(e.Control, new ControlLayout(
                (double)e.Control.Top / (double)parent.Height, (double)e.Control.Left / (double)parent.Width,
                (double)e.Control.Width / (double)parent.Width, (double)e.Control.Height / (double)parent.Height));
        }

        void ControlRemoved(object sender, ControlEventArgs e)
        {
            subControls.Remove(e.Control);
        }
    }

posted on 2008-12-10 14:29  lexod  阅读(469)  评论(0编辑  收藏  举报