怎样让Windows Form上的控件跟随窗体的缩放而自适应大小

实际操作起来可能没有你想象的那么简单吧!你需要响应Form Resize之类的事件,然后根据事件,实时逐个调整控件的大小。在WPF中就简单多了。
■网友
改进C# WinForm窗体及其控件自适应各种屏幕分辨率
一。说明  2012-11-30 曾经写过 《C# WinForm窗体及其控件自适应各种屏幕分辨率》 ,其中也讲解了控件自适应的原理。近期有网友说,装在panel里面的控件,没有效果?
  这是控件嵌套的问题,加入即可实现。使用皮肤时,要注意在窗体Load事件中,有些控件(比如DataGridView)的子控件还没有完成,在这里记录控件的个数比较少,而在窗体SizeChanged事件中获取的比较多(是正常的)。  解决的方法是,记录控件的初始位置和大小以及处理控件的缩放,都放到窗体SizeChanged事件中,只需第一次记录控件的初始位置和大小,之后再调用类的自适应方法即可。二。使用方法  1.把自适应的类整体复制到你的工程命名空间里,(这样做,每个窗体均可使用)   然后在需要自适应的窗体中做2步即可:  2.声明自适应类实例。  3.为窗体添加SizeChanged事件,并在其方法Form1_SizeChanged中,首次记录窗体和其控件初始位置和大小,之后调用类的自适应方法,完成自适应。三。完整代码如下:(一)。自适应窗体的代码:
using System;using System.Windows.Forms;
namespace WindowsFormsApplication1{ public partial class Form1 : Form { //1.声明自适应类实例 AutoSizeFormClass asc = new AutoSizeFormClass(); public Form1() { InitializeComponent(); //如果加入"皮肤",则不能在Form1_Load中记录控件的大小和位置,因为有些控件如dataGridView的子控件还未完成 //而要在在Form1_SizeChanged中,第一次改变时,记录控件的大小和位置 this.skinEngine1.SkinFile = "EmeraldColor1.ssk"; } //2. 为窗体添加Load事件,并在其方法Form1_Load中,调用类的初始化方法,记录窗体和其控件的初始位置和大小 private void Form1_Load(object sender, EventArgs e) { // asc.controllInitializeSize(this); } //3.为窗体添加SizeChanged事件,并在其方法Form1_SizeChanged中,调用类的自适应方法,完成自适应 private void Form1_SizeChanged(object sender, EventArgs e) { asc.controlAutoSize(this); // this.WindowState = (System.Windows.Forms.FormWindowState)(2);//记录完控件的初始位置和大小后,再最大化 }
}
}
(二)。自适应类的代码
using System.Collections.Generic;using System.Windows.Forms;
namespace WindowsFormsApplication1{ class AutoSizeFormClass { //(1).声明结构,只记录窗体和其控件的初始位置和大小。 public struct controlRect { public int Left; public int Top; public int Width; public int Height; } //(2).声明 1个对象 //注意这里不能使用控件列表记录 List nCtrl;,因为控件的关联性,记录的始终是当前的大小。 // public List oldCtrl= new List();//这里将西文的大于小于号都过滤掉了,只能改为中文的,使用中要改回西文 public List《controlRect》 oldCtrl = new List《controlRect》(); int ctrlNo = 0;//1; //(3). 创建两个函数 //(3.1)记录窗体和其控件的初始位置和大小, public void controllInitializeSize(Control mForm) { controlRect cR; cR.Left = mForm.Left; cR.Top = mForm.Top; cR.Width = mForm.Width; cR.Height = mForm.Height; oldCtrl.Add(cR);//第一个为"窗体本身",只加入一次即可


推荐阅读