控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

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

作者:不详 出处:IT专家网论坛 2010年02月03日 阅读:

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());
  }
  }
  }
  }

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统