在网上看了一些别人写的方法:
方法一:(自己实践过)
看见有人说:不要使用Scale这个函数,这个函数很诱人,可以改变控件大小,这个函数用了SizeF这个结构,然而第一改变比如最大化后是对的,但是还原后一切都不是那么回事了。(具体什么情况不是很了解)
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); //每次使用的都是最初始的控件大小,保证准确无误。 } }
方法二:
public Form1() { InitializeComponent(); Hashtable ht = new Hashtable();//使用哈希表存放位置以及控件在容器中的位置比例 ht.Add("width", Size.Width); ht.Add("height", Size.Height); foreach (Control ctrl in this.Controls) { ht.Add(ctrl.Name + "X", ctrl.Location.X / (double)Size.Width);//存储控件在容器中的相对比例 ht.Add(ctrl.Name + "Y", ctrl.Location.Y / (double)Size.Height);//存储控件在容器中的相对比例 ctrl.Tag = ctrl.Size; } Tag = ht; } private void Form1_Resize(object sender, EventArgs e) { Hashtable scale = (Hashtable)Tag; foreach (Control ctrl in this.Controls) { ctrl.Left = (int)(Size.Width * (double)scale[ctrl.Name + "X"]); ctrl.Top = (int)(Size.Height * (double)scale[ctrl.Name + "Y"]); ctrl.Width = (int)(Size.Width*1.0f / (int)scale["width"] * ((Size)ctrl.Tag).Width); ctrl.Height = (int)(Size.Height*1.0f / (int)scale["height"] * ((Size)ctrl.Tag).Height); //每次使用的都是最初始的控件大小,保证准确无误。 } }
以上方法可以实现如题功能,但是如果我们在TextBox 里写入的内容超过text的length,会有一部分文字被隐藏,当我们拉伸窗体后,我们会发现,窗体里控件的size都增大了,但是textbox里隐藏部分的内容还是没有显示出来。这样看起来还是有点小不爽,对吧。那么下面用一个取巧的方法去掉这一瑕疵。
在执行Resize之前,将TextBox里的value记录下来,待Resize执行之后,重新赋值:
private void Form1_Resize(object sender, EventArgs e)
{
// 获取TextBox的个数 int textBoxCount = 0; foreach (Control c in Controls) { if (c.GetType().Name == "TextBox") { textBoxCount++; } } //将TextBox里的内容记下来后,设置为空 string[] tmpTextBoxValue = new string[textBoxCount]; int j = 0; foreach (Control c in Controls) { if (c.GetType().Name == "TextBox") { tmpTextBoxValue[j] = c.Text; j++; c.Text = ""; } } //执行resize 事件 float[] scale = (float[])Tag; int i = 2; foreach (Control crl in Controls) { crl.Left = (int)(Size.Width * scale[i++]); crl.Top = (int)(Size.Height * scale[i++]); crl.Width = (int)(Size.Width / (float)scale[0] * ((Size)crl.Tag).Width); crl.Height = (int)(Size.Height / (float)scale[1] * ((Size)crl.Tag).Height); } //重新写入Textbox的值 int m = 0; foreach (Control c in Controls) { if (c.GetType().Name =="TextBox") { //c.Focus(); c.Text = tmpTextBoxValue[m]; m++; } } }
有取巧的嫌疑,但还是很好的实现了想要的效果。