C# 窗体缩放的时候同步改变控件的大小和字体
最新在写个小程序,需要窗体填满各种尺寸的显示器,同时需要同步缩放控件的大小。于是就写了个类,简单的调用一下即可解决问题。
这个类可以同步缩放控件的位置,宽度高度,字体大小。
使用的时候在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# 窗体缩放的时候同步改变控件的大小和字体的更多相关文章
- MFC中改变控件的大小和位置(zz)
用CWnd类的函数MoveWindow()或SetWindowPos()能够改变控件的大小和位置. void MoveWindow(int x,int y,int nWidth,int nHeight ...
- MFC中改变控件的大小和位置
用CWnd类的函数MoveWindow()或SetWindowPos()可以改变控件的大小和位置. void MoveWindow(int x,int y,int nWidth,int nHeight ...
- 运行时改变控件的大小(点击后立刻ReleaseCapture,然后计算位移,最后发消息改变位置)——最有趣的是TPanel其实也有窗口标题,因此可发HTCAPTION消息
//光标在控件不同位置时的样式 // 由于拐角这点手动精确实在困难 所以用范围 范围+3 这样很容易就找到这一点了 procedure CtrlMouseMove(Ctrl: TWinControl; ...
- Android中动态改变控件的大小的一种方法
在Android中有时候我们需要动态改变控件的大小.有几种办法可以实现 一是在onMeasure中修改尺寸,二是在onLayout中修改位置和尺寸.这个是可以进行位置修改的,onMeasure不行. ...
- MFC 改变控件的大小和位置
mfc 改变控件大小和位置用到的函数: ) void MoveWindow(int x, int y, int nWidth, int nHeight); ) void MoveWindow(LPCR ...
- C# 运行时通过鼠标拖动改变控件的大小
来源:http://blog.csdn.net/yanleigis/article/details/1819447 using System; using System.Collections.Gen ...
- C++ MFC 改变控件大小和位置
用CWnd类的函数MoveWindow()或SetWindowPos()可以改变控件的大小和位置. void MoveWindow(int x,int y,int nWidth,int nHeight ...
- C# Winform窗体和控件自适应大小
1.在项目中创建类AutoSizeForm AutoSizeForm.cs文件代码: using System; using System.Collections.Generic; using Sys ...
- Winform窗体控件自适应大小
自己写的winform窗体自适应大小代码,代码比较独立,很适合贴来贴去不会对原有程序造成影响,可以直接继承此类或者把代码复制到自己的代码里面直接使用 借鉴了网上的一些资料,最后采用重写WndProc方 ...
随机推荐
- 中文字体font-family常用列表
Windows的一些: 黑体:SimHei 宋体:SimSun 新宋体:NSimSun 仿宋:FangSong 楷体:KaiTi 仿宋_GB2312:FangSong_GB2312 楷体_GB2312 ...
- iOS 开发技术牛人博客
dark_gmn 的博客 http://blog.csdn.net/dark_gmn?viewmode=contents Tel_小超 的博客 http://blog.csdn.net/qq_2 ...
- Objective-C 30分钟入门教程
Objective-C 30分钟入门教程 我第一次看OC觉得这个语言的语法有些怪异,为什么充满了@符号,[]符号,函数调用没有()这个,但是面向对象的高级语言也不外乎类,接口,多态,封装,继承等概念. ...
- eclipse整体设置
2.Eclipse for android 设置代码提示功能(1)设置 java 文件的代码提示功能打开 Eclipse 依次选择 Window > Preferences > Java ...
- Android的四大组件之Activity
Android的四大组件之Activity Activity:是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,Content Provider内容提供者,B ...
- SQL SERVER中用户定义标量函数(scalar user defined function)的性能问题
用户定义函数(UDF)分类 SQL SERVER中的用户定义函数(User Defined Functions 简称UDF)分为标量函数(Scalar-Valued Function)和表值函数(T ...
- Java之TreeMap
基本特性: 基于红黑树. 非线程安全. 同步使用: SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...))
- 【转】document.cookie详解
设置cookie 每个cookie都是一个名/值对,可以把下面这样一个字符串赋值给document.cookie: document.cookie="userId=828"; 如果 ...
- Vim插件管理
一.简介 二.管理器 1)Vundle https://github.com/gmarik/vundle.git 2)vim-plug https://github.com/junegunn/vim- ...
- 【Windows编程】系列第二篇:Windows SDK创建基本控件
在Win32 SDK环境下,怎么来创建常用的那些基本控件呢?我们知道如果用MFC,简单的拖放即可完成大多数控件的创建,但是我们既然是用Windows SDK API编程,当然是从根上解决这个问题,实际 ...