您的位置:首页 > 其它

WinFrom窗体上的控件随着窗体的大小而自动调整比例

2010-10-13 14:37 351 查看
用Anchor或Dock属性,最多是绑定边距和填充效果,可我不想要那种效果。因为控件会走样。比方说,Dock选择fill控件会铺满整个窗口了。
一开始注册了一个Form.Resize事件,没有写对,窗口最小话后控件就走样。后来查了一个相关方法:
http://blog.csdn.net/alldj/archive/2007/04/13/1564077.aspx
publicstaticvoidAutoScale(Formfrm)
{
frm.Tag=frm.Width.ToString()+","+frm.Height.ToString();
frm.SizeChanged+=newEventHandler(frm_SizeChanged);
}
staticvoidfrm_SizeChanged(objectsender,EventArgse)
{
string[]tmp=((Form)sender).Tag.ToString().Split(',');
floatwidth=(float)((Form)sender).Width/(float)Convert.ToInt16(tmp[0]);
floatheigth=(float)((Form)sender).Height/(float)Convert.ToInt16(tmp[1]);
((Form)sender).Tag=((Form)sender).Width.ToString()+","+((Form)sender).Height;

foreach(Controlcontrolin((Form)sender).Controls)
{
control.Scale(newSizeF(width,heigth));
}
}
注:如果窗口需要在一开始就最大化,请在最大化前调用此方法。
发现也有这个问题。于是很侥幸的加了个判断:
public void Form1_SizeChanged(object sender, EventArgs e)
{
//OldWidth = this.Width;
//OldHeight = this.Height;
if (this.WindowState != FormWindowState.Minimized)
{
float NewWidth = (float)((Form)sender).Width;
float NewHeight = (float)((Form)sender).Height;
float WidthPercent = NewWidth / OldWidth;
float HeightPercent = NewHeight / OldHeight;
foreach (Control control in ((Form)sender).Controls)
{
control.Scale(new SizeF(WidthPercent, HeightPercent));
}
OldWidth = NewWidth;
OldHeight = NewHeight;
}
}
OldWidth和OldHeight在窗体初始化时已经被赋给了当时窗体的Width和Height值。
问题居然解决了。估计Resize事件处理中加这句话应该也可以吧。没试。
另外,对Control.Resize事件和Control.SizeChanged事件的概念不是很清楚。一个是在调整控件大小时发生,另一个是在控件Size属性值更改时发生。比较搞不明白哪个是哪个。
最后需要注明的是:如果事先对控件进行了Anchor和Dock属性的设置,这个方法就不管用了,因此要用这个方法,必须先把设置的Anchor和Dock属性去掉。让其默认。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: