查了很多这方面的帖子,多数人都说用Anchor或Dock属性,但我想那不是想要的效果吧。
Anchor是让控件到窗体各个方向的距离保持不变,Dock选fill的话控件就铺满整个窗口了。我想要的效果是窗体里有很多控件,当我们拉动窗体变大时,所有的控件都随着变大,其比例和原来的比例相同。
请问可以通过设置属性来实现吗?如果可以,应该怎么设?还是要通过写代码来实现?
Anchor是让控件到窗体各个方向的距离保持不变,Dock选fill的话控件就铺满整个窗口了。我想要的效果是窗体里有很多控件,当我们拉动窗体变大时,所有的控件都随着变大,其比例和原来的比例相同。
请问可以通过设置属性来实现吗?如果可以,应该怎么设?还是要通过写代码来实现?
/// 窗口改变后控件变化
/// </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);
}
this.Resize +=new EventHandler(Frm_Resize);