1. 程式人生 > >C#中使控制元件隨著窗體一起變化(常見困難以及修正)

C#中使控制元件隨著窗體一起變化(常見困難以及修正)

1.使用一些佈局面板,比如FlowLayoutPanel,TabLayOutPanel之類,但是缺點就是樣式太死了。所以本人不採用。

2.採用Dock和Anchor屬性。這類雖然滑鼠點幾下在屬性欄設定一下就好,但是缺乏靈活性。只有上下左右中間幾種選擇。

3.採用Form_Resize()。這種方法最靈活,思路是窗體變化時,直接重寫這個變化函式。

那麼如何寫呢?第一要將原來窗體的屬性以及各個控制元件的所佔位置的比例存入Tag中(Tag可以存任何東西哦!)

廢話少說,直接貼程式碼:

上面的程式碼似乎沒有問題,但是實際上,每次控制元件大小的變化有誤差,導致多次變化後控制元件嚴重變型,紅色的程式碼部分存在嚴重問題。那麼應該如何修改呢?

經過本人的修改與測試,下面的程式碼準確無誤。

        public Form1()

        {

            InitializeComponent();

            int count = this.Controls.Count * 2+2;

            float[] factor = new float[count];

            int i = 0;

            factor[i++] = Size.Width;

            factor[i++] = Size.Height;

            foreach(Control ctrl in this.Controls)

            {

                factor[i++] = ctrl.Location.X / (float)Size.Width;

                factor[i++] = ctrl.Location.Y / (float)Size.Height;

                ctrl.Tag = ctrl.Size;

            }

            Tag = factor;

        }

        private void Form1_Resize(object sender, EventArgs e)

        {

            float[] scale = (float[])Tag;

            int i = 2;

            foreach (Control ctrl in this.Controls)

            {

                ctrl.Left = (int)(Size.Width * scale[i++]);

                ctrl.Top = (int)(Size.Height * scale[i++]);

                ctrl.Width = (int)(Size.Width / (float)scale[0] * ((Size)ctrl.Tag).Width);

                ctrl.Height = (int)(Size.Height / (float)scale[1] * ((Size)ctrl.Tag).Height);  

                //每次使用的都是最初始的控制元件大小,保證準確無誤。

            }

        }

4.注意點和誤區。千萬不要使用Scale這個函式,這個函式很誘人,似乎可以改變控制元件大小,這個函式用了SizeF這個結構,然而第一改變比如最大化後是對的,但是你還原後一切都不是那麼回事了。我也不知道是怎麼回事。程式反正是不對的。如果有朋友使用過可以告訴我,謝謝。