【转】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());


      }
    } 


  }


}

转载于:https://www.cnblogs.com/rainuu/archive/2010/03/11/1683136.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值