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

      }
    }

  }

}

时间: 2024-10-16 04:44:05

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

Delphi类的入门例子(8): 遍历窗体中所有控件的函数

//显示窗体中所有控件的函数 function GetCtrls(Control: TWinControl; List: TStringList): Boolean; var i: Integer; obj: TWinControl; begin for i := 0 to Control.ControlCount-1 do begin obj := TWinControl(Control.Controls[i]); List.Add(obj.Name); //如果控件中包含其他控件, 则递归调

C#中ListView控件实现窗体代码_C#教程

废话不多说了,直接给大家贴关键代码了. 具体代码如下所示: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namesp

《Visual Basic 2012入门经典》----1.5 在窗体中添加控件

1.5 在窗体中添加控件 Visual Basic 2012入门经典设置窗体的初始属性后,现在通过在窗体中添加对象来创建用户界面.可置于窗体中的对象被称为控件.有些控件有可见的界面,用户可与之进行交互:而另外一些控件对用户总是不可见的.本示例将使用这两种控件.屏幕的左边是标题为"Toolbox"的竖直选项卡,单击"Toolbox"选项卡显示"Toolbox"窗口以显示最常用的控件:如果有必要,单击"Common Controls&quo

Windows窗体控件如何给WPF窗体中的控件传递信息????????

问题描述 请问大家,我这里有两个工程,一个是WPF窗体工程,一个是Windows窗体控件.然后WPF窗体工程中加载了Windows窗体控件.现在我再在WPF窗体中加入两个TextBox控件,我希望鼠标在Windows窗体控件内移动鼠标的时候,Windows窗体控件的Mouse_Move事件触发,并且该事件中能够编写代码把鼠标当前位置的X,Y坐标分别显示在WPF窗体的TextBox控件内.请问,这如何实现呢? 解决方案 解决方案二:自己顶一下.望大家帮忙.解决方案三:PostMessage解决方案

在C#中用户控件与窗体间的消息传递

控件   如果在C#中实现用户定义控件内的事件挂勾到调用的窗体事件中            我们都知道在ASP.net开发中,如果使用用户定义控件可以有效的进行程序的模块化.其实在.net  的WinForm中也是可以使用的. 细节如下:1.新建应用程序WindowsApplication1.2.添加新的用户控件UserLogin.(如图User)3.定义用户属性       //定义属性  public string Username  {   get{return username;}   

怎样在一个类中调用另一个窗体中的控件?

问题描述 一个串口接收类recvClass,有个线程recvThread接收数据,一个窗体FORM2,怎样在FORM2的listbox1中添加recvThread到的数据?有什么好方法吗? 解决方案 解决方案二:是否可以考虑在你接收数据的线程中访问Form2的listbox1控件注:若采用上述方法,则需要考虑采用Invoke方法来实现在线程recvThread中调用listbox1控件具体示例可参考网络上的那些在多线程程序中访问并更新主线程进度条处理解决方案三:recvClass类里:publi

请问如何在类中使用窗体和窗体中的控件

问题描述 请各位前辈多多指教,谢谢 解决方案 解决方案二:窗体和控件都是类,控件的Modify属性设置成public就可以在其他类中访问了.解决方案三:参考program.cs,它就是一个非窗口类,调用了主窗口.

C#窗体中删除控件和与控件相关的代码

问题描述 C#窗体应用程序中,删除一个控件,直接delete会导致程序出错,但是与控件相关的代码太多,一行一行的删代码太费时,怎么办?删除控件的时候怎么才能把与之相关的代码删了? 解决方案 本帖最后由 sinat_34493579 于 2016-05-30 10:46:42 编辑解决方案二:你要的功能太不安全,删一个控件代码都没了,万一误删了怎么办?代码白写?解决方案三:引用1楼xdashewan的回复: 你要的功能太不安全,删一个控件代码都没了,万一误删了怎么办?代码白写? 删一个控件,不删与

Winform窗体中某些控件怎么触发键盘事件

问题描述 我在使用中想给Label和MSChart添加键盘事件,但好像这些控件无法获取焦点所以事件总是不起作用.在查到资料如:非字符键不会引发KeyPress事件:但非字符键却可以引发KeyDown和KeyUp事件.使用KeyChar属性在运行时对键击进行取样,并且使用或修改公共键击的子集.我不知道为什么给MSChart添加了KeyDown和KeyUp事件,还是没反应? 解决方案 解决方案二:整个form的KeyPress事件,试试看解决方案三:引用1楼hanjun0612的回复: 整个form