C#当窗体大小改变时,窗体中的控件大小也随之改变
2024-10-21 11:47:43
第一种:推荐
在窗体中加上如下代码即可实现,但窗体点击放大按钮时却不能改变控件大小。
private Size beforeResizeSize = Size.Empty;protectedoverridevoid OnResizeBegin(EventArgs e){ base.OnResizeBegin(e); beforeResizeSize =this.Size;}protectedoverridevoid 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 (Control control inthis.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);
//设置窗口控件随窗口大小改变而改变publicnewvoid AutoScale(Form frm){ frm.Tag = frm.Width.ToString() +","+ frm.Height.ToString(); frm.SizeChanged +=newEventHandler(frm_SizeChanged);}publicvoid 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
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);
}
}
publicvoid GetAllCrlSize(Control CrlContainer)//获得并存储窗体中各控件的初始尺寸
{
foreach (Control iCrl in CrlContainer.Controls)
{
if (iCrl.Controls.Count >0)
GetAllCrlSize(iCrl);
CrlSizeWidth.Add(iCrl.Width);
CrlSizeHeight.Add(iCrl.Height);
}
}
publicvoid GetInitialFormSize()//获得并存储窗体的初始尺寸
{
FormSizeWidth =this.Size.Width;
FormSizeHeight =this.Size.Height;
}
privatevoid 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);
}
}
publicvoid 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++;
}
}
}
}
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);
}
}
publicvoid GetAllCrlSize(Control CrlContainer)//获得并存储窗体中各控件的初始尺寸
{
foreach (Control iCrl in CrlContainer.Controls)
{
if (iCrl.Controls.Count >0)
GetAllCrlSize(iCrl);
CrlSizeWidth.Add(iCrl.Width);
CrlSizeHeight.Add(iCrl.Height);
}
}
publicvoid GetInitialFormSize()//获得并存储窗体的初始尺寸
{
FormSizeWidth =this.Size.Width;
FormSizeHeight =this.Size.Height;
}
privatevoid 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);
}
}
publicvoid 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
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时有用
分类: WinForm
最新文章
- python2与python3在windows下共存
- POJ 2253 Frogger -- 最短路变形
- A+B Problem 详细解答 (转载)
- 如何用Apache POI操作Excel文件-----如何在已有的Excel文件中插入一行新的数据?
- vim中如何替换
- ASP.NET缓存全解析5:文件缓存依赖 转自网络原文作者李天平
- SaaS系列介绍之四:我国SaaS市场发展
- Centos添加硬盘分区、挂载磁盘
- LINUX系统镜像下载总汇
- netbeans git 配置(ssh方式)
- (转)Java.lang.reflect.Method invoke方法 实例
- vue组件弹窗
- flask-session 在redis中存储session
- Geoserver 发布shp格式地图服务
- 如何判断JavaScript数据具体类型
- Mybatis插入数据后返回主键id
- Linux 用户和文件
- 浏览器跨域访问WebApi
- python虚拟机运行原理
- learn go function callback