最新在写个小程序,需要窗体填满各种尺寸的显示器,同时需要同步缩放控件的大小。于是就写了个类,简单的调用一下即可解决问题。

这个类可以同步缩放控件的位置,宽度高度,字体大小。

使用的时候在FormLoad里面绑定一下即可:

    public partial class Form1 : Form
{
private ControlResizer Resizer; //定义缩放类 public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
//绑定
Resizer=new ControlResizer(this);
} }

控件缩放类的代码:

     /// <summary>
/// 同步缩放窗体上控件的大小和字体
/// </summary>
public class ControlResizer
{
class ControlPosAndSize
{
public float FrmWidth { get; set; }
public float FrmHeight { get; set; }
public int Left { get; set; }
public int Top { get; set; }
public int Width { get; set; }
public int Height { get; set; }
public float FontSize { get; set; } } private Form _form; //句柄,大小信息
private Dictionary<int, ControlPosAndSize> _dic = new Dictionary<int, ControlPosAndSize>();
public ControlResizer(Form form)
{
_form = form;
_form.Resize += _form_Resize;//绑定窗体大小改变事件 _form.ControlAdded += form_ControlAdded; //窗体上新增控件的处理
_form.ControlRemoved += form_ControlRemoved; SnapControlSize(_form);//记录控件和窗体大小
} void form_ControlRemoved(object sender, ControlEventArgs e)
{
var key = e.Control.Handle.ToInt32();
_dic.Remove(key);
} //绑定控件添加事件
private void form_ControlAdded(object sender, ControlEventArgs e)
{
var ctl = e.Control;
var ps = new ControlPosAndSize
{
FrmHeight = _form.Height,
FrmWidth = _form.Width,
Width = ctl.Width,
Height = ctl.Height,
Left = ctl.Left,
Top = ctl.Top,
FontSize = ctl.Font.Size
};
var key = ctl.Handle.ToInt32();
_dic[key] = ps;
} void _form_Resize(object sender, EventArgs e)
{
ResizeControl(_form);
} private void ResizeControl(Control control)
{
foreach (Control ctl in control.Controls)
{
var key = ctl.Handle.ToInt32();
if (_dic.ContainsKey(key))
{
var ps = _dic[key];
var newx = _form.Width / ps.FrmWidth;
var newy = _form.Height / ps.FrmHeight; ctl.Top = (int)(ps.Top * newy);
ctl.Height = (int)(ps.Height * newy); ctl.Left = (int)(ps.Left * newx);
ctl.Width = (int)(ps.Width * newx); ctl.Font = new Font(ctl.Font.Name, ps.FontSize * newy, ctl.Font.Style, ctl.Font.Unit); if (ctl.Controls.Count > )
{
ResizeControl(ctl);
} } }
} /// <summary>
/// 创建控件的大小快照,参数为需要记录大小控件的 容器
/// </summary>
private void SnapControlSize(Control control)
{
foreach (Control ctl in control.Controls)
{
var ps = new ControlPosAndSize
{
FrmHeight = _form.Height,
FrmWidth = _form.Width,
Width = ctl.Width,
Height = ctl.Height,
Left = ctl.Left,
Top = ctl.Top,
FontSize = ctl.Font.Size
}; var key = ctl.Handle.ToInt32(); _dic[key] = ps; //绑定添加事件
ctl.ControlAdded += form_ControlAdded;
ctl.ControlRemoved += form_ControlRemoved; if (ctl.Controls.Count > )
{
SnapControlSize(ctl);
} } } }

C# 窗体缩放的时候同步改变控件的大小和字体的更多相关文章

  1. MFC中改变控件的大小和位置(zz)

    用CWnd类的函数MoveWindow()或SetWindowPos()能够改变控件的大小和位置. void MoveWindow(int x,int y,int nWidth,int nHeight ...

  2. MFC中改变控件的大小和位置

    用CWnd类的函数MoveWindow()或SetWindowPos()可以改变控件的大小和位置. void MoveWindow(int x,int y,int nWidth,int nHeight ...

  3. 运行时改变控件的大小(点击后立刻ReleaseCapture,然后计算位移,最后发消息改变位置)——最有趣的是TPanel其实也有窗口标题,因此可发HTCAPTION消息

    //光标在控件不同位置时的样式 // 由于拐角这点手动精确实在困难 所以用范围 范围+3 这样很容易就找到这一点了 procedure CtrlMouseMove(Ctrl: TWinControl; ...

  4. Android中动态改变控件的大小的一种方法

    在Android中有时候我们需要动态改变控件的大小.有几种办法可以实现  一是在onMeasure中修改尺寸,二是在onLayout中修改位置和尺寸.这个是可以进行位置修改的,onMeasure不行. ...

  5. MFC 改变控件的大小和位置

    mfc 改变控件大小和位置用到的函数: ) void MoveWindow(int x, int y, int nWidth, int nHeight); ) void MoveWindow(LPCR ...

  6. C# 运行时通过鼠标拖动改变控件的大小

    来源:http://blog.csdn.net/yanleigis/article/details/1819447 using System; using System.Collections.Gen ...

  7. C++ MFC 改变控件大小和位置

    用CWnd类的函数MoveWindow()或SetWindowPos()可以改变控件的大小和位置. void MoveWindow(int x,int y,int nWidth,int nHeight ...

  8. C# Winform窗体和控件自适应大小

    1.在项目中创建类AutoSizeForm AutoSizeForm.cs文件代码: using System; using System.Collections.Generic; using Sys ...

  9. Winform窗体控件自适应大小

    自己写的winform窗体自适应大小代码,代码比较独立,很适合贴来贴去不会对原有程序造成影响,可以直接继承此类或者把代码复制到自己的代码里面直接使用 借鉴了网上的一些资料,最后采用重写WndProc方 ...

随机推荐

  1. MySQL的SSL加密连接与性能开销

    本文转载自:http://www.innomysql.net/article/23959.html(只作转载, 不代表本站和博主同意文中观点或证实文中信息) Contents [hide] 1 前言 ...

  2. Atitit 面向对象编程(OOP)、面向组件编程(COP)、面向方面编程(AOP)和面向服务编程(SOP)的区别和联系

    Atitit 面向对象编程(OOP).面向组件编程(COP).面向方面编程(AOP)和面向服务编程(SOP)的区别和联系 1. 面向组件编程(COP) 所以,组件比起对象来的进步就在于通用的规范的引入 ...

  3. javascript中的弹框

    大家都见过某度中的恶意广告,你关闭了又出来了!为何,JS来告诉你 效果猛戳此处 HTML <body> <h3 class="whiteColor">无法关 ...

  4. jQuery静态方法noop,camelCase,nodeName,trim使用和源码分析

    noop方法 jQuery.noop()函数是一个空函数,它什么也不做. 当某些时候你需要传入函数参数,而且希望它什么也不做的时候,你可以使用该函数,也无需再新建一个空的函数. 示例: // 传入一个 ...

  5. iOS Block简介

    Block是对象,它封装了一段代码,这段代码可以在任何时候执行.block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值.它和传统的函数指针很类似,但是有区别:block是inli ...

  6. MyEclipse使用心得:SVN插件安装方法

    1.在线安装,打开myeclipse,help--->MyEclipse Configuration Center 2.点击Add Site 打开对话框,在对话框Name输入Svn,URL中输入 ...

  7. 基于 AVPlayer 自定义播放器

    如果我只是简单的播放一个视频,而不需要考虑播放器的界面.iOS9.0 之前使用 MPMoviePlayerController, 或者内部自带一个 view 的 MPMoviePlayerViewCo ...

  8. 初学HTML 常见的标签(二) 列表标签

    上次介绍了一些简单的文本标签设计, 这篇介绍列表类标签, 通过列表能写出很好看的, 多元化的网络页面. ul-li 列表标签 <ul> <li>列表1</li> & ...

  9. 关于final关键字和抽象类,接口

    final主要用于修饰类,方法以及属性 当用于修饰类时,则这个类不能被子类继承,换而言之该类没有子类 当用于修饰方法时,该方法也是不能被复写的 当用于修饰属性时,同理属性值不能被更改 抽象类,当存在抽 ...

  10. Java暗箱操作之自动装箱与拆箱

    我以前在写Android项目的时候,估计写得最多最熟练的几句话就是: List<Integer> list = new ArrayList<Integer>(); list.a ...