/**********************************C#中代碼實現控件隨窗體的自由變換********************************************/
// 文章出處: 星魂工作室 作者:月雲
// 2008.8.4
/**********************************************************************************************************/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace WindowsApplication3
{
public partial class Form1 : Form
{
/*******************設定程序中可能要用到的用以存儲初始數據的動態數組及相關私有變量******************************/
private ArrayList InitialCrl = new ArrayList();//用以存儲窗體中所有的控件名稱
private ArrayList CrlLocationX = new ArrayList();//用以存儲窗體中所有的控件原始位置
private ArrayList CrlLocationY = new ArrayList();//用以存儲窗體中所有的控件原始位置
private ArrayList CrlSizeWidth = new ArrayList();//用以存儲窗體中所有的控件原始的水平尺寸
private ArrayList CrlSizeHeight = new ArrayList();//用以存儲窗體中所有的控件原始的垂直尺寸
private int FormSizeWidth;//用以存儲窗體原始的水平尺寸
private int FormSizeHeight;//用以存儲窗體原始的垂直尺寸
private double FormSizeChangedX;//用以存儲相關父窗體/容器的水平變化量
private double FormSizeChangedY;//用以存儲相關父窗體/容器的垂直變化量
private int Wcounter = 0;//為防止遞歸遍歷控件時產生混亂,故專門設定一個全局計數器
/****************************************************************************************************************/
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
GetInitialFormSize();
//this.AutoScroll = true;
//this.SetAutoSizeMode(FormSizeWidth,FormSizeHeight);
//this.AutoScrollMinSize.Width = FormSizeWidth;
//this.AutoScrollMinSize.Height = FormSizeHeight;
GetAllCrlLocation(this);
GetAllCrlSize(this);
}
public void GetAllCrlLocation(Control CrlContainer)//獲得並存儲窗體中各控件的初始位置
{
foreach (Control iCrl in CrlContainer.Controls)
{
if (iCrl.Controls.Count > 0)
GetAllCrlLocation(iCrl);
InitialCrl.Add(iCrl);
CrlLocationX.Add(iCrl.Location.X);
CrlLocationY.Add(iCrl.Location.Y);
}
}
public void GetAllCrlSize(Control CrlContainer)//獲得並存儲窗體中各控件的初始尺寸
{
foreach (Control iCrl in CrlContainer.Controls)
{
if (iCrl.Controls.Count > 0)
GetAllCrlSize(iCrl);
CrlSizeWidth.Add(iCrl.Width);
CrlSizeHeight.Add(iCrl.Height);
}
}
public void GetInitialFormSize()//獲得並存儲窗體的初始尺寸
{
FormSizeWidth = this.Size.Width;
FormSizeHeight = this.Size.Height;
}
private void Form1_SizeChanged(object sender, EventArgs e)
{
// MessageBox.Show("窗體尺寸改變");
Wcounter = 0;
int counter = 0;
if (this.Size.Width < FormSizeWidth || this.Size.Height < FormSizeHeight)
//如果窗體的大小在改變過程中小於窗體尺寸的初始值,則窗體中的各個控件自動重置為初始尺寸,且窗體自動添加滾動條
{
foreach (Control iniCrl in InitialCrl)
{
iniCrl.Width = (int)CrlSizeWidth[counter];
iniCrl.Height = (int)CrlSizeHeight[counter];
Point point = new Point();
point.X = (int)CrlLocationX[counter];
point.Y = (int)CrlLocationY[counter];
iniCrl.Bounds = new Rectangle(point, iniCrl.Size);
counter++;
}
this.AutoScroll = true;
}
else
//否則,重新設定窗體中所有控件的大小(窗體內所有控件的大小隨窗體大小的變化而變化)
{
this.AutoScroll = false;
ResetAllCrlState(this);
}
}
public void ResetAllCrlState(Control CrlContainer)//重新設定窗體中各控件的狀態(在與原狀態的對比中計算而來)
{
FormSizeChangedX = (double)this.Size.Width / (double)FormSizeWidth;
FormSizeChangedY = (double)this.Size.Height / (double)FormSizeHeight;
foreach (Control kCrl in CrlContainer.Controls)
{
/*string name = kCrl.Name.ToString();
MessageBox.Show(name);
MessageBox.Show(Wcounter.ToString());*/
if (kCrl.Controls.Count > 0)
{
ResetAllCrlState(kCrl);
}
Point point = new Point();
point.X = (int)((int)CrlLocationX[Wcounter] * FormSizeChangedX);
point.Y = (int)((int)CrlLocationY[Wcounter] * FormSizeChangedY);
kCrl.Width = (int)((int)CrlSizeWidth[Wcounter] * FormSizeChangedX);
kCrl.Height = (int)((int)CrlSizeHeight[Wcounter] * FormSizeChangedY);
kCrl.Bounds = new Rectangle(point, kCrl.Size);
Wcounter++;
// MessageBox.Show(Wcounter.ToString());
}
}
}
}