实现步骤:
1.在窗体中放一个容器(例如:Panel),并且将容器的Dock属性设置为Fill。窗体中其他控件都放在这个容器中。
2.创建一个窗体类,该类继承于原始窗体类,并在新建的这个窗体类中添加如下代码,以后创建的窗体都继承于新建的这个窗体类:
#region控件缩放
doubleformWidth;//窗体原始宽度
doubleformHeight;//窗体原始高度
doublescaleX;//水平缩放比例
doublescaleY;//垂直缩放比例
Dictionary<string,string>controlInfo=newDictionary<string,string>();//控件中心Left,Top,控件Width,控件Height,控件字体Size
///<summary>
///获取所有原始数据
///</summary>
protectedvoidGetAllInitInfo(ControlCrlContainer)
{
if(CrlContainer.Parent==this)
{
formWidth=Convert.ToDouble(CrlContainer.Width);
formHeight=Convert.ToDouble(CrlContainer.Height);
}
foreach(ControliteminCrlContainer.Controls)
{
if(item.Name.Trim()!="")
controlInfo.Add(item.Name,(item.Left+item.Width/2)+","+(item.Top+item.Height/2)+","+item.Width+","+item.Height+","+item.Font.Size);
if((itemasUserControl)==null&&item.Controls.Count>0) GetAllInitInfo(item);
}
}
privatevoidControlsChangeInit(ControlCrlContainer)
{
scaleX=(Convert.ToDouble(CrlContainer.Width)/formWidth);
scaleY=(Convert.ToDouble(CrlContainer.Height)/formHeight);
}
privatevoidControlsChange(ControlCrlContainer)
{
double[]pos=newdouble[5];//pos数组保存当前控件中心Left,Top,控件Width,控件Height,控件字体Size
foreach(ControliteminCrlContainer.Controls)
{
if(item.Name.Trim()!="")
{
if((itemasUserControl)==null&&item.Controls.Count>0)
ControlsChange(item);
string[]strs=controlInfo[item.Name].Split(',');
for(intj=0;j<5;j++)
{
pos[j]=Convert.ToDouble(strs[j]);
}
doubleitemWidth=pos[2]*scaleX;
doubleitemHeight=pos[3]*scaleY;
item.Left=Convert.ToInt32(pos[0]*scaleX-itemWidth/2);
item.Top=Convert.ToInt32(pos[1]*scaleY-itemHeight/2);
item.Width=Convert.ToInt32(itemWidth);
item.Height=Convert.ToInt32(itemHeight);
item.Font=newFont(item.Font.Name,float.Parse((pos[4]*Math.Min(scaleX,scaleY)).ToString()));
}
}
}
#endregion
3.在新建的窗体类中重写OnSizeChanged事件,并调用ControlsChangeInit和ControlsChange方法,代码如下:
protectedoverridevoidOnSizeChanged(EventArgse)
{
base.OnSizeChanged(e);
if(controlInfo.Count>0)
{
ControlsChangeInit(this.Controls[0]);
ControlsChange(this.Controls[0]);
}
}
4.在窗体的构造函数中调用GetAllInitInfo方法,代码如下:
GetAllInitInfo(this.Controls[0]);
注:原创,转载请指明出处。