文章参考:http://blog.csdn.net/loveme1204/archive/2007/12/24/1964577.aspx
是一篇vb编写的,我只是把它翻译成c#的.
其实Anchor和Dock属性也可以实现,但好象只对容器效果理想,而且字体大小也没有变化.最近论坛上有好多这样的贴子,具体实现代码如下:
- private void setTag(Control cons)
- {
- foreach (Control con in cons.Controls)
- {
- con.Tag = con.Width +":" + con.Height + ":" + con.Left + ":" + con.Top + ":" + con.Font.Size;
- if (con.Controls.Count > 0)
- setTag(con);
- }
- }
- private void setControls(float newx, float newy, Control cons)
- {
- foreach (Control con in cons .Controls )
- {
- string[] mytag = con.Tag.ToString().Split(new char[] { ':' });
- float a = Convert.ToSingle(mytag[0]) * newx;
- con.Width = (int)a;
- a=Convert.ToSingle(mytag[1]) * newy;
- con.Height = (int)(a);
- a=Convert.ToSingle(mytag[2]) * newx;
- con.Left = (int)(a);
- a=Convert.ToSingle(mytag[3]) * newy;
- con.Top = (int)(a);
- Single currentSize = Convert.ToSingle (mytag[4]) * newy;
- con .Font =new Font (con.Font .Name ,currentSize,con.Font .Style ,con.Font .Unit );
- if(con.Controls .Count >0)
- {
- setControls (newx ,newy ,con );
- }
- }
- }
- void Form1_Resize(object sender, EventArgs e)
- {
- // throw new Exception("The method or operation is not implemented.");
- float newx = (this.Width )/ X;
- // float newy = (this.Height - this.statusStrip1.Height) / (Y - y);
- float newy = this.Height / Y;
- setControls(newx, newy, this);
- this.Text = this.Width.ToString() +" "+ this.Height.ToString();
- }
- 在Form_Load里面添加:
- this.Resize += new EventHandler(Form1_Resize);
- X = this.Width;
- Y = this.Height;
- y = this.statusStrip1.Height;
- setTag (this);
当然定义了两个全局变量,private float X; private float Y;
细心的你一定会发现还有个y ;这是因为有statusStrip1之类的控件,这是就一定要注意,窗体的实际宽度和高度一定要减去statusStrip1之类.
如果是容器,最好将Anchor和Dock属性也修改过来.
效果还不错.
帖子:http://topic.csdn.net/u/20080516/13/12a39498-314f-4a7b-a210-6988f79da0f4.htm
在上面程序中,如果不用到控件的tag属性,可以正常运行。否则会带来问题,所以,在此基础上改进了一下
1
private void setOriginControlsSize(Control cons)
{
foreach (Control con in cons.Controls)
{
if (con.Name.Length == 0)
continue;
string strCtlSize = con.Width + ":" + con.Height + ":" + con.Left + ":" + con.Top + ":" + con.Font.Size;
dicControls.Add(con.Name, strCtlSize);
Console.WriteLine("{0}:{1}", con.Name, strCtlSize);
if (con.Controls.Count > 0)
setOriginControlsSize(con);
}
}
private void setNewControlsSize(float newx, float newy, Control cons)
{
foreach (Control con in cons.Controls)
{
object objCtlSize;
Console.WriteLine("{0}", con.Name);
if (false == dicControls.TryGetValue(con.Name, out objCtlSize))
continue;
Console.WriteLine("{0}", objCtlSize);
string[] mytag = objCtlSize.ToString().Split(new char[] { ':' });
float a = Convert.ToSingle(mytag[0]) * newx;
con.Width = (int)a;
a = Convert.ToSingle(mytag[1]) * newy;
con.Height = (int)(a);
a = Convert.ToSingle(mytag[2]) * newx;
con.Left = (int)(a);
a = Convert.ToSingle(mytag[3]) * newy;
con.Top = (int)(a);
Single currentSize = Convert.ToSingle(mytag[4]) * newy;
con.Font = new System.Drawing.Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit);
if (con.Controls.Count > 0)
{
setNewControlsSize(newx, newy, con);
}
}
}
需要定义变量 private Dictionary<string, object> dicControls;