前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[C#]控件大小随窗体改变而改变

[C#]控件大小随窗体改变而改变

作者头像
祥知道
发布2020-03-10 15:09:23
2.8K0
发布2020-03-10 15:09:23
举报
文章被收录于专栏:祥的专栏

这篇文章写的很好,一般我会选择第一种。 我改了一下格式,便于大家复制黏贴,O(∩_∩)O


第一种: 推荐

在窗体中加上如下代码即可实现,但窗体点击放大按钮时却不能改变控件大小。

代码语言:javascript
复制
private Size beforeResizeSize = Size.Empty;

protected override void OnResizeBegin(EventArgs e)
{
      base.OnResizeBegin(e);
      beforeResizeSize =this.Size;
}
protected override void OnResizeEnd(EventArgs e)
{
      base.OnResizeEnd(e);
      //窗口resize之后的大小
      Size endResizeSize =this.Size;
      //获得变化比例
      float percentWidth = (float)endResizeSize.Width / beforeResizeSize.Width;
      float percentHeight = (float)endResizeSize.Height / beforeResizeSize.Height;
      foreach (System.Windows.Forms.Control control in this.Controls)
      {
            if (control is DataGridView)
                 continue;
            //按比例改变控件大小
            control.Width = (int)(control.Width * percentWidth);
            control.Height = (int)(control.Height * percentHeight);
            //为了不使控件之间覆盖 位置也要按比例变化
            control.Left = (int)(control.Left * percentWidth);
            control.Top = (int)(control.Top * percentHeight);
     }
}

第二种: 效果很差

在加载事件中写 AutoScale(this);

代码语言:javascript
复制
//设置窗口控件随窗口大小改变而改变
public new void AutoScale(Form frm)
{
      frm.Tag = frm.Width.ToString() +","+ frm.Height.ToString();
      frm.SizeChanged +=newEventHandler(frm_SizeChanged);
}
public void frm_SizeChanged(object sender, EventArgs e)
{
      string[] tmp = ((Form)sender).Tag.ToString().Split(',');
      float width = (float)((Form)sender).Width / (float)Convert.ToInt32(tmp[0]);
      float height = (float)((Form)sender).Height / (float)Convert.ToInt32(tmp[1]);
      ((Form)sender).Tag = ((Form)sender).Width.ToString() +","+ ((Form)sender).Height;
      string str = ((Form)sender).Tag.ToString();
      // int font_size = Int32.Parse(str.Substring(0, str.IndexOf(','))) / 100;
      //也可使字体随之改变
      float tempWidth=0F;
      float tempHeight=0F;
      foreach (Control control in ((Form)sender).Controls)
      {
           if (control is DataGridView)
                 continue;
           if (control is TextBox)
           {
                tempHeight = height;
                tempWidth =width;
           } 
           if (control  is Button)
           {
                if (this.WindowState == FormWindowState.Maximized)
                     tempHeight -=0.4F;
                else
                     tempHeight +=0.2F;
                control.Scale(new SizeF(tempWidth, tempHeight));
           }
           else
           {
                control.Scale(new SizeF(width, height));
           }
      }
}

第三种

http://www.cnblogs.com/kenkao/archive/2008/11/10/1330623.html

代码语言:javascript
复制
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
{
    publicpartialclass 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();//用以存储窗体中所有的控件原始的垂直尺寸
    privateint FormSizeWidth;//用以存储窗体原始的水平尺寸
    privateint FormSizeHeight;//用以存储窗体原始的垂直尺寸
    privatedouble FormSizeChangedX;//用以存储相关父窗体/容器的水平变化量
    privatedouble FormSizeChangedY;//用以存储相关父窗体/容器的垂直变化量 
    privateint Wcounter =0;//为防止递归遍历控件时产生混乱,故专门设定一个全局计数器


        public Form1()
        {
            InitializeComponent();
        } 

        privatevoid 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);
        }
        publicvoid 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++;               
            }
        } 
    }   
}

第四种

C#实现窗体控件随窗体大小改变(包括字体大小) 修正版 http://www.cnblogs.com/jason-liu-blogs/archive/2012/10/28/2743243.html

代码语言:javascript
复制
private float X;

private float Y;

private void  setTag(Control cons)
        {
            foreach (Control con in cons.Controls)
            {
                con.Tag = con.Width +":" + con.Height + ":" + con.Left + ":" + con.Top + ":" + con.Font.Size;
                if (con.Controls.Count > 0)
                    setTag(con);                
            }
        }
        private void setControls(float   newx, float  newy, Control  cons)
        {
            foreach (Control  con in cons .Controls )
            {

                string[] mytag = con.Tag.ToString().Split(new char[] { ':' });
                float a = Convert.ToSingle(mytag[0]) * newx;
                con.Width = (int)a;
                a=Convert.ToSingle(mytag[1]) * newy;
                con.Height = (int)(a);
                a=Convert.ToSingle(mytag[2]) * newx;
                con.Left = (int)(a);
                a=Convert.ToSingle(mytag[3]) * newy;
                con.Top = (int)(a);
                Single currentSize = Convert.ToSingle (mytag[4]) * Math.Min(newx,newy);
                con .Font =new Font (con.Font .Name ,currentSize,con.Font .Style ,con.Font .Unit );
                if(con.Controls .Count >0)
                {
                    setControls (newx ,newy ,con );
                }
            }

        }

        void Form1_Resize(object sender, EventArgs e)
        {
            float  newx = (this.Width )/ X;
            float newy = this.Height / Y;
            setControls(newx, newy, this);
            this.Text = this.Width.ToString() +" "+ this.Height.ToString();

        }



在Form_Load里面添加:  

this.Resize += new EventHandler(Form1_Resize);    

//X = this.Width;    
//Y = this.Height;    


setTag (this);  
Form1_Resize(new object(),new EventArgs());//x,y可在实例化时赋值,最后这句是新加的,在MDI时有用

转自:http://www.cnblogs.com/slyzly/articles/1965965.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第一种: 推荐
  • 第二种: 效果很差
  • 第三种
  • 第四种
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档