查了很多这方面的帖子,多数人都说用Anchor或Dock属性,但我想那不是想要的效果吧。
Anchor是让控件到窗体各个方向的距离保持不变,Dock选fill的话控件就铺满整个窗口了。我想要的效果是窗体里有很多控件,当我们拉动窗体变大时,所有的控件都随着变大,其比例和原来的比例相同。
请问可以通过设置属性来实现吗?如果可以,应该怎么设?还是要通过写代码来实现?

解决方案 »

  1.   

    同样地,给控件里的每一个控件都设置anchor值~
      

  2.   

    /// <summary>
    /// 窗口改变后控件变化
    /// </summary>

    float x=0;
    float y=0; private void Frm_Resize(object sender, System.EventArgs e)
    {
    float  newx = (this.Width )/ x;
    float newy = this.Height / y;
    setConstrols(newx, newy, this);
    }
    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 setConstrols(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)
    {
    setConstrols (newx ,newy ,con );
    }
    }
    } private void Frm_Load(object sender, System.EventArgs e)
    {
    x=this.Width ;
    y=this.Height ;
    setTag(this);
    }
      

  3.   

    在Form中注册SizeChanged事件,在事件处理函数中,相应修改你要更改的控件的大小和位置。位置肯定也要变的!计算大小和位置的算法,对你来说应该不难写!
      

  4.   

    http://topic.csdn.net/u/20080516/13/12a39498-314f-4a7b-a210-6988f79da0f4.html
      

  5.   

    在在5楼 的Form_load里面添加
    this.Resize +=new EventHandler(Frm_Resize);