C#实现控件随窗体大小自动改变c#2009-12-1617:56:45阅读1207评论0字号:大中小订阅usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Collections;namespaceWindowsApplication3{publicpartialclassForm1:Form{/*******************设定程序中可能要用到的用以存储初始数据的动态数组及相关私有变量******************************/privateArrayListInitialCrl=newArrayList();//用以存储窗体中所有的控件名称privateArrayListCrlLocationX=newArrayList();//用以存储窗体中所有的控件原始位置privateArrayListCrlLocationY=newArrayList();//用以存储窗体中所有的控件原始位置privateArrayListCrlSizeWidth=newArrayList();//用以存储窗体中所有的控件原始的水平尺寸privateArrayListCrlSizeHeight=newArrayList();//用以存储窗体中所有的控件原始的垂直尺寸privateintFormSizeWidth;//用以存储窗体原始的水平尺寸privateintFormSizeHeight;//用以存储窗体原始的垂直尺寸privatedoubleFormSizeChangedX;//用以存储相关父窗体/容器的水平变化量privatedoubleFormSizeChangedY;//用以存储相关父窗体/容器的垂直变化量privateintWcounter=0;//为防止递归遍历控件时产生混乱,故专门设定一个全局计数器/****************************************************************************************************************/publicForm1(){InitializeComponent();}privatevoidForm1_Load(objectsender,EventArgse){GetInitialFormSize();//this.AutoScroll=true;//this.SetAutoSizeMode(FormSizeWidth,FormSizeHeight);//this.AutoScrollMinSize.Width=FormSizeWidth;//this.AutoScrollMinSize.Height=FormSizeHeight;GetAllCrlLocation(this);GetAllCrlSize(this);}publicvoidGetAllCrlLocation(ControlCrlContainer)//获得并存储窗体中各控件的初始位置{foreach(ControliCrlinCrlContainer.Controls){if(iCrl.Controls.Count0)GetAllCrlLocation(iCrl);InitialCrl.Add(iCrl);CrlLocationX.Add(iCrl.Location.X);CrlLocationY.Add(iCrl.Location.Y);}}publicvoidGetAllCrlSize(ControlCrlContainer)//获得并存储窗体中各控件的初始尺寸{foreach(ControliCrlinCrlContainer.Controls){if(iCrl.Controls.Count0)GetAllCrlSize(iCrl);CrlSizeWidth.Add(iCrl.Width);CrlSizeHeight.Add(iCrl.Height);}}publicvoidGetInitialFormSize()//获得并存储窗体的初始尺寸{FormSizeWidth=this.Size.Width;FormSizeHeight=this.Size.Height;}privatevoidForm1_SizeChanged(objectsender,EventArgse){//MessageBox.Show(窗体尺寸改变);Wcounter=0;intcounter=0;if(this.Size.WidthFormSizeWidth||this.Size.HeightFormSizeHeight)//如果窗体的大小在改变过程中小于窗体尺寸的初始值,则窗体中的各个控件自动重置为初始尺寸,且窗体自动添加滚动条{foreach(ControliniCrlinInitialCrl){iniCrl.Width=(int)CrlSizeWidth[counter];iniCrl.Height=(int)CrlSizeHeight[counter];Pointpoint=newPoint();point.X=(int)CrlLocationX[counter];point.Y=(int)CrlLocationY[counter];iniCrl.Bounds=newRectangle(point,iniCrl.Size);counter++;}this.AutoScroll=true;}else//否则,重新设定窗体中所有控件的大小(窗体内所有控件的大小随窗体大小的变化而变化){this.AutoScroll=false;ResetAllCrlState(this);}}publicvoidResetAllCrlState(ControlCrlContainer)//重新设定窗体中各控件的状态(在与原状态的对比中计算而来){FormSizeChangedX=(double)this.Size.Width/(double)FormSizeWidth;FormSizeChangedY=(double)this.Size.Height/(double)FormSizeHeight;foreach(ControlkCrlinCrlContainer.Controls){/*stringname=kCrl.Name.ToString();MessageBox.Show(name);MessageBox.Show(Wcounter.ToString());*/if(kCrl.Controls.Count0){ResetAllCrlState(kCrl);}Pointpoint=newPoint();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=newRectangle(point,kCrl.Size);Wcounter++;//MessageBox.Show(Wcounter.ToString());}}}}System包含用于定义常用值和引用数据类型、事件和事件处理程序、接口、属性和处理异常的基础类和基类。其他类提供支持下列操作的服务:数据类型转换,方法参数操作,数学计算,远程和本地程序调用,应用程序环境管理以及对托管和非托管应用程序的监管。System.Collections包含定义各种对象集合(如列表、队列、位数组、哈希表和字典)的接口和类。System.Collections.Generic包含定义泛型集合的接口和类;泛型集合允许用户创建强类型的集合,这种集合在类型安全和性能上均优于非泛型强类型集合。System.ComponentModel提供用于实现组件和控件的运行时和设计时行为的类。此命名空间包括用于属性和类型转换器的实现、数据源绑定和组件授权的基类和接口。System.Data包含组成大部分ADO.NET结构的类。ADO.NET结构使您可以生成可用于有效管理来自多个数据源的数据的组件。在断开连接的方案(如Internet)中,ADO.NET提供了一些可以在多层系统中请求、更新和协调数据的工具。ADO.NET结构也可以在客户端应用程序(如Windows窗体)或ASP.NET创建的HTML页中实现。System.Drawing提供对GDI+基本图形功能的访问。System.Drawing.Drawing2D、System.Drawing.Imaging和System.Drawing.Text命名空间中提供了更高级的功能。System.Text包含表示ASCII、Unicode、UTF-7和UTF-8字符编码的类;用于在字符块和字节块之间相互转换的抽象基类;以及不需要创建字符串的中间实例就可以操作和格式化字符串对象的帮助器类。System.Windows.Forms包含用于创建基于Windows的应用程序的类,这些应用程序可以充分利用MicrosoftWindows操作系统中的丰富用户界面功能。…………C#多线程(System.Threading)线程的命名空间比如(启用新线程,线程休眠)等操作的1.使用线程的情况①.程序需要执行和两个和多个任务②.程序要等待某事件的发生:例如用户输入、文件操作、网络操作和搜索③.后台程序2.多线程的并发执行如果有多个线程在执行,单CPU只有一个,到底执行的哪个?①.如果一个线程连续占用CPU资源时间过长,其它的资源得不到执行,则系统会强制的切换执行其它线程。(强制剥夺)②.如果一个线程没事可做、CPU可执行其它线程。(主动放弃)③.这是由操作系统的调度机制决定的,不同的操作系统调度机制不一样。一般无法精确的预料多线程的执行顺序,在程序设计的时候应特别注意3.创建并启动线程ThreadStart线程启动委托名=newThreadStart(方法名);Thread线程实例名=newThread(线程启动委托名);线程实例名.Start();4.终止线程①.线程实例名.Abort();用此方法的后果是不可恢复的终止线程。②.线程实例名.Interrupt();中断后可恢复5.休眠线程①.线程实例名.Sleep();当线程Sleep时,系统就立即退出执行队列一段时间,当睡眠结束时,系统会产生一个时钟中断,从而使线程回到执行队列中,从而恢复线程的执行。6.挂起/恢复线程①.线程实例名.Suspend();挂起与线程休眠不同,线程的挂起不会使线程立即停止执行,直到线程到达安全点之后它才可以将该线程挂起,如果线程尚未启动或已经停止,则它将不能挂起。②.线程实例名.Resume();恢复将使一个线程跳出挂起状态并使该线程继续执行。一个线程不能对另一个线程调用Sleep(),但是一个线程可以对另一个线程调用Suspend()。还可以使用许多其它的方式来阻塞线程。例如,可以通过调用Thread.Join使一个线程等待另一个线程(子线程)停止。使用Monitor.Wait使一个线程等待访问一个同步对象。7.串行化线程①.线程实例名.jion();例如在主线程中插入t.jion();主线程执行到这条语句后,主线程(当前线程)立即进入阻塞状态.直到t运行完