/// <summary>
/// 此类可以实现窗体的随意缩放保持内部控件的相对位置
/// </summary>
public class AutoSizedControllor
{
/// <summary>
/// 控件布局类
/// </summary>
private class ControlLayout
{
public double WidthPresent, HeightPresent, TopPresent, LeftPresent;
public ControlLayout(double top, double left, double width, double height)
{
WidthPresent = width;
HeightPresent = height;
TopPresent = top;
LeftPresent = left;
}
}
private Control parent;
private System.Collections.Hashtable subControls = new System.Collections.Hashtable();
/// <summary>
/// 注册
/// </summary>
/// <param name="ctrl">容器控件</param>
public void regist(Control vectorControl,bool registSubVectorControl)
{
//注册事件
parent = vectorControl;
parent.ControlAdded += new ControlEventHandler(ControlAdded);
parent.ControlRemoved += new ControlEventHandler(ControlRemoved);
parent.Resize += new EventHandler(Resize);
//记录位置
foreach (Control ctl in vectorControl.Controls)
{
if (registSubVectorControl && ctl.Controls.Count > 0)
{
AutoSizedControllor subController = new AutoSizedControllor();
subController.regist(ctl,registSubVectorControl);
}
// else
// {
// if(rect.Width.ToString ( )=="800")
// {
// subControls.Add(ctl,new ControlLayout(
// (double)ctl.Top / 768, (double)ctl.Left / 1024,
// (double)ctl.Width / 1024, (double)ctl.Height / 768));
// }
// else
// {
subControls.Add(ctl,new ControlLayout(
(double)ctl.Top / (double)parent.Height, (double)ctl.Left / (double)parent.Width,
(double)ctl.Width / (double)parent.Width, (double)ctl.Height / (double)parent.Height));
// }
// }
}
}
public void regist1(Control vectorControl,bool registSubVectorControl)
{
//注册事件
parent = vectorControl;
parent.ControlAdded += new ControlEventHandler(ControlAdded1);
parent.ControlRemoved += new ControlEventHandler(ControlRemoved);
parent.Resize += new EventHandler(Resize1);
//记录位置
foreach (Control ctl in vectorControl.Controls)
{
if (registSubVectorControl && ctl.Controls.Count > 0)
{
AutoSizedControllor subController = new AutoSizedControllor();
subController.regist(ctl,registSubVectorControl);
}
subControls.Add(ctl,new ControlLayout(
(double)ctl.Top / 768, (double)ctl.Left / 1024,
(double)ctl.Width / 1024, (double)ctl.Height / 768));
}
}
void Resize(object sender, EventArgs e)
{
int iCount = parent.Controls.Count;
foreach(Control ctl in parent.Controls)
{
ctl.Left = (int)((subControls[ctl] as ControlLayout).LeftPresent * (double)parent.Width);
//ctl.Top = (int)((subControls[ctl] as ControlLayout).TopPresent * (double)parent.Height);
ctl.Width = (int)((subControls[ctl] as ControlLayout).WidthPresent * (double)parent.Width);
//ctl.Height = (int)((subControls[ctl] as ControlLayout).HeightPresent * (double)parent.Height);
}
}
void Resize1(object sender, EventArgs e)
{
int iCount = parent.Controls.Count;
foreach(Control ctl in parent.Controls)
{
ctl.Left = (int)((subControls[ctl] as ControlLayout).LeftPresent * 800);
ctl.Top = (int)((subControls[ctl] as ControlLayout).TopPresent * 600);
ctl.Width = (int)((subControls[ctl] as ControlLayout).WidthPresent * 800);
ctl.Height = (int)((subControls[ctl] as ControlLayout).HeightPresent * 600);
}
}
void ControlAdded1(object sender, ControlEventArgs e)
{
subControls.Add(e.Control, new ControlLayout(
(double)e.Control.Top / 768, (double)e.Control.Left / 1024,
(double)e.Control.Width / 1024, (double)e.Control.Height / 768));
}
void ControlAdded(object sender, ControlEventArgs e)
{
subControls.Add(e.Control, new ControlLayout(
(double)e.Control.Top / (double)parent.Height, (double)e.Control.Left / (double)parent.Width,
(double)e.Control.Width / (double)parent.Width, (double)e.Control.Height / (double)parent.Height));
}
void ControlRemoved(object sender, ControlEventArgs e)
{
subControls.Remove(e.Control);
}
}