什么牌子的儿童安全座椅好:C#中代码实现控件随窗体的自由变换

来源:百度文库 编辑:偶看新闻 时间:2024/05/09 00:21:33

C#实现窗体中所有控件跟随窗体尺寸的自由变换

 

/**********************************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());


}
}


}


}
请问C#如何在一个类或一个窗体中使用用另一个窗体的控件? c# 窗体控件问题 如何用父窗体的控件对子窗体中打开的文件实现查找的功能? C#中怎么样实现控件拖放 c#语言asp.net实现treeview控件读数据库动态生成树的代码 如何在窗体中控制FLASH控件的大小随着窗口的大小而改变代码 C#中,怎么实现在第一个窗体上点一个按钮,出现第二个窗体 vb中使用数据库窗体向导是选择帮定ado控件和帮定ado代码所生成的窗体代码有什么区别? C#中,怎样能让窗体中的内容和GDI绘图的内容随窗体大小改变而缩放? c#怎么实现任意形状窗体 在vb 6.0中我想在MDI窗体中加载一个TreeView控件.怎么实现啊? C#中怎么获起正在运行的窗体实例 关于C#编程中启动新窗体的问题 hough变换的c++实现方法!最好有源代码 C#中一个控件的鼠标双击事件连接一个已写好的安钮单击事件的代码怎么写? 我欲寻找能实现星际争霸游戏中地图自由切换的代码 c# 窗体数据的传递 在VB中怎样用窗体中的用户控件来拖动无标题的窗体? 高手请进!c# 多窗体控件如何互相调用 C#中怎样实现 图片的打印 请问如何用C#在窗体上实现指定分钟或小时的倒计时时钟?? 请问有什么好的控件可以实现vb窗体分割? VB窗体中控件达到极限不能再创建更多的控件,请问怎么解决 如何用C#代码实现对图片的放大