文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>WinFrom窗体上的控件随着窗体的大小而自动调整比例

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

时间:2010-10-13  来源:Jessica Lu

用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属性去掉。让其默认。
排行榜 更多 +
试着飞手游下载

试着飞手游下载

休闲益智 下载
血染小镇(功能菜单)中文版下载

血染小镇(功能菜单)中文版下载

飞行射击 下载
泰坦之旅高爆版下载

泰坦之旅高爆版下载

角色扮演 下载