C#当窗体大小改变时,窗体中的控件大小也随之改变
第一种:推荐
在窗体中加上如下代码即可实现,但窗体点击放大按钮时却不能改变控件大小。
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.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时有用


C#当窗体大小改变时,窗体中的控件大小也随之改变的更多相关文章
- C# 清除当前窗体中TextBox控件中的内容
//当有多个窗体时,对顶层的窗口进行操作,例如:我们开发具有录入功能的界面的时候,为了防止提交后的二次(重复)录入,希望点击提交按钮并提示成功后,界面的所有文本框内容能够自动清空.NET Framew ...
- 【机房系统知识小结点系列】之遍历窗体中的控件,判断Text是否为空?
做机房系统时,几乎每个窗体中都会用到判断界面中的控件是否为空的情景.我们曾经是这样走来的: 第一版: 好处:对窗体界面中的Text等控件,逐一做判断,当用户输入某一项为空的时候,会议弹出框的形式,告诉 ...
- C# 向程序新建的窗体中添加控件,控件需要先实例化,然后用controls.add添加到新的窗体中去
C# 向程序新建的窗体中添加控件,控件需要先实例化,然后用controls.add添加到新的窗体中去 Form settingForm = new Form(); setForm deviceSet ...
- 五种情况下会刷新控件状态(刷新所有子FWinControls的显示)——从DFM读取数据时、新增加子控件时、重新创建当前控件的句柄时、设置父控件时、显示状态被改变时
五种情况下会刷新控件状态(刷新控件状态才能刷新所有子FWinControls的显示): 在TWinControls.PaintControls中,对所有FWinControls只是重绘了边框,而没有整 ...
- .net dataGridView当鼠标经过时当前行背景色变色;然后【给GridView增加单击行事件,并获取单击行的数据填充到页面中的控件中】
1.首先在前台dataGridview属性中增加onRowDataBound属性事件 2.然后在后台Observing_RowDataBound事件中增加代码 protected void Obser ...
- js中使用控件名和数组下标方式获取控件的值时失败
在做界面展示时涉及到表单行项目的增加和删除时,我们一帮都使用js的脚本实现表单行的增加和删除,那么在进行表单的提交的时我们会再页面上进行提交数据的初步校验,进行数据的初步校验时,就要动态获取控件的值. ...
- 母版页改变被嵌套的页面中的控件ID的解决方法
使用过模板页的朋友都会很纳闷,怎么页面的用js通过getElementById(“id”):找不到对象.查看了页面源代码才发现,原来控件的ID变了,这是母版页导致的.因为母版页怕母版页本身页面中的控件 ...
- Android 中常见控件的介绍和使用
1 TextView文本框 1.1 TextView类的结构 TextView 是用于显示字符串的组件,对于用户来说就是屏幕中一块用于显示文本的区域.TextView类的层次关系如下: java.la ...
- C# Winform 界面中各控件随着窗口大小变化
在做一项工程中,由于不确定目标平台的分辨率,而正常使用要求铺满整个屏幕,所以界面中的各个控件必须能够适应窗口的变化. 首先想到的就是控件的百分比布局,但是再尝试写了几个控件的Location和Size ...
- MFC中ComboBox控件用法
MFC ComboBox 一.入门篇 ComboBox (组合框)控件很简单,可以节省空间.从用户角度来看,这个控件是由一个文本输入控件和一个下拉菜单组成的.用户可以从一个预先定义的列表里选择一个选项 ...
随机推荐
- c++的double转string(转)
原文地址:https://www.cnblogs.com/finallyliuyu/p/1810071.html c++中double转换成string型(浮点数的格式化)(转) 在日常编程中-- ...
- mac 暗黑破坏神2
https://590m.com/f/28636472-500475496-61a14b (访问密码:7410) 此版本可以更改人员属性参数,过程有点复杂,如需了解,请留言+v沟通吧... 编辑 ...
- netmiko批量操作网络设备_pandas版
from concurrent.futures import ThreadPoolExecutor import netmiko import os from threading import Loc ...
- Biba模型(MAC)
毕巴模型用完整性级别来对完整性进行量化描述. 设i1和i2是任意两个完整性级别,如果完整性级别为i2的实体比完整性级别为i1的实体具有更高的完整性,则称完整性级别i2绝对支配完整性级别i1,记为:i ...
- (已解决)富文本编辑器:使用layui的layedit怎么回显存放在数据库里的富文本数据(包含有图片base64码)?
1. 背景 我把富文本内容从后台导入到前端,回显在layui的layedit里面. 2. 步骤 直接在<textarea></textarea>中间进行赋值(我用的是模板赋值) ...
- KVM虚拟机的认知
Kernel-based Virtual Machine简称KVM,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中.它使用Linux自身的调度器进行管理 ...
- 注释:MARK与TODO、FIXME
MARK: 在OC中的用法: #pragma mark -说明文字(可以不加-) 在swift中的用法:// MARK: - 说明文字(可以不加-) TODO.FIXME(不区分OC.swift) / ...
- 【python】pip的问题
在更新pip的时候因为安装pip需要管理员权限,但是呢,又把pip给uninstall了 所以结果就是没有pip这个模块了 https://stackoverflow.com/questions/18 ...
- prepare
目标: 自动驾驶感知负责深度学习感知算法开发,包括目标识别.分割.检测.多目标追踪等有扎实的数理基础,有Linux.ROS.QNX等开发经验,熟悉C/C++编程,有良好的编程习惯 他人简历: skil ...
- 《这里分别闭合离合器Zm和Z2会分别有什么效果》 回复
<这里分别闭合离合器Zm和Z2会分别有什么效果> https://tieba.baidu.com/p/8246021959 .