public struct FormSizeChange
{
public Size currentSize;//当前窗体大小
public int count;//控件个数
public Size[] sizes;//控件大小
public Int32[] CLeft;//距离左端的像素
public Int32[] CTop;//距离顶端的像素
/// <summary>
/// 根据当前窗体的大小,与原窗体的大小对比
/// 更改控件的大小和字体
/// </summary>
/// <param name="formSizeChange"></param>
/// <param name="Controls"></param>
/// <param name="form"></param>
public static void ChangeContrlSize(ref FormSizeChange formSizeChange, ControlCollection Controls,Form form)
{
Int32 width, height;
int i = 0;
foreach (Control c in Controls)
{
Type type = c.GetType();
//if (type == null|| type.Name== "HScrollBar" || type.Name == "VScrollBar") continue;
//c.Name.ToString();
//if (c.HasChildren)
//{ ChangeContrlSize(ref formSizeChange,c.Controls,form); }
float mfn = (float)form.Size.Height / formSizeChange.currentSize.Height;//放大率
width = Convert.ToInt32(((float)form.Size.Width / formSizeChange.currentSize.Width) * formSizeChange.sizes[i].Width);
height = Convert.ToInt32(((float)form.Size.Height / formSizeChange.currentSize.Height) * formSizeChange.sizes[i].Height);
c.Size = new Size(width, height);
c.Left = Convert.ToInt32(((float)form.Size.Width / formSizeChange.currentSize.Width) * formSizeChange.CLeft[i]);
c.Top = Convert.ToInt32(((float)form.Size.Height / formSizeChange.currentSize.Height) * formSizeChange.CTop[i]);
c.Font = new Font(c.Font.FontFamily, formSizeChange.fonts[i].Size * mfn);
c.Name.ToString();
i++;
}
}
/// <summary>
/// 得到控件个数
/// 初始化结构体并赋值给
/// </summary>
/// <param name="formSizeChange">结构体</param>
/// <param name="form">窗体</param>
public static void GetFromSize(ref FormSizeChange formSizeChange, Form form)
{
int i = 0;
i = GetControlCount(form.Controls);
formSizeChange.sizes = new Size[i];
formSizeChange.CLeft = new int[i];
formSizeChange.CTop = new int[i];
formSizeChange.currentSize = form.Size;
formSizeChange.fonts =new Font[i];
formSizeChange.count = i;
//count = 0;
GetformSizeChange(ref formSizeChange, form.Controls);
//foreach (Control c in form.Controls)
//{
// formSizeChange. sizes[i] = c.Size;
// formSizeChange.CLeft[i] = c.Left;
// formSizeChange.CTop[i] = c.Top;
// formSizeChange.fonts[i] = c.Font;
// i++;
//}
}
/// <summary>
/// 获取控件的属性值放入formSizeChange的一个结构体中
/// </summary>
/// <param name="formSizeChange"></param>
/// <param name="controls"></param>
public static void GetformSizeChange(ref FormSizeChange formSizeChange, ControlCollection controls)
{
int i = 0;
foreach(Control c in controls)
{
if ("DGVQRCode" == c.Name.ToString()) {
c.Name.ToString();
}
//if (c.HasChildren) {
// GetformSizeChange(ref formSizeChange,c.Controls);
//}
formSizeChange.sizes[i] = c.Size;
formSizeChange.CLeft[i] = c.Left;
formSizeChange.CTop[i] = c.Top;
formSizeChange.fonts[i] = c.Font;
i++;
}
}
/// <summary>
/// 获取窗体控件的数量
/// </summary>
/// <param name="controls"></param>
/// <returns></returns>
public static int GetControlCount(ControlCollection controls)
{
int i = 0;
foreach (Control c in controls)
{
//c.Name.ToString();
//if (c.HasChildren)
//{
// GetControlCount(c.Controls);
//}
i++;
}
return i;
}
private void Login_Load(object sender, EventArgs e)
{
PubFun.GetFromSize(ref formSizeChange, this);
}
private void Login_SizeChanged(object sender, EventArgs e)
{
PubFun. ChangeFromSize(formSizeChange, this);
}
未解决问题:
1、可以用递归方式遍历所有控件;我试过如Panel 或者groupbox等控件或出现一些问题,会出现位置偏移
2、如果用datagridview控件,也会出现控件无法使用
希望各位大侠给出好的解决方法;