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


    }
    }


    }


    }
    
    
  • 相关阅读:
    C++隐式推导-auto关键词
    git的几种实用操作(合并代码与暂存复原代码)
    CPU的后记,程序员的未来之计
    CPU中的程序是怎么运行起来的
    nginx-日志切割
    Linux里面使用navicat连接MySQL数据显示2002-Can't connect to local MysQL serverthrough socket'/var/lib/mysq/mysql.sock'(13"权限不够")
    Cacti图形中的方框乱码解决办法
    Cacti1.2.14最新版安装和配置(详细版)
    ERROR 1419 (HY000) at line 9: You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
    Linux服务器查看对应网卡的网口
  • 原文地址:https://www.cnblogs.com/kenkao/p/1330623.html
Copyright © 2020-2023  润新知