C#实用开发(4)---Winform窗体自适应和布局自适应

1. 在主窗体中添加核心代码

#region 控件大小随窗体大小等比例缩放
 
        private readonly float x; //定义当前窗体的宽度
        private readonly 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)
                //获取控件的Tag属性值,并分割后存储字符串数组
                if (con.Tag != null)
                {
                    var mytag = con.Tag.ToString().Split(';');
                    //根据窗体缩放的比例确定控件的值
                    con.Width = Convert.ToInt32(Convert.ToSingle(mytag[0]) * newx); //宽度
                    con.Height = Convert.ToInt32(Convert.ToSingle(mytag[1]) * newy); //高度
                    con.Left = Convert.ToInt32(Convert.ToSingle(mytag[2]) * newx); //左边距
                    con.Top = Convert.ToInt32(Convert.ToSingle(mytag[3]) * newy); //顶边距
                    var currentSize = Convert.ToSingle(mytag[4]) * newy; //字体大小                   
                    if (currentSize > 0) con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit);
                    con.Focus();
                    if (con.Controls.Count > 0) setControls(newx, newy, con);
                }
        }
 
 
        /// <summary>
        /// 重置窗体布局
        /// </summary>
        private void ReWinformLayout()
        {
            var newx = Width / x;
            var newy = Height / y;
            setControls(newx, newy, this);
 
        }
 
        #endregion

2. 在窗体构造函数内初始化适配

        public Form1()
        {
            InitializeComponent();
 
            #region   初始化控件缩放
 
            x = Width;
            y = Height;
            setTag(this);
 
            #endregion 
        }

3. 在Resize事件中调用重绘函数

 private void Form1_Resize(object sender, EventArgs e)
        {
            ReWinformLayout();

        }

更新…添加另一种自带自适应布局的方法。上面的是要我们自己去计算比例缩放,其实winfrom有自带的.

首先还是要先获取当前窗体的大小,算了直接贴代码。

public Form1()			//窗口构造函数不必多说
{
    InitializeComponent();		
    
    //获取窗口的大小,Tag随便保存的,也可以定义变量保存
    this.Tag  = this.Width.ToString()+","+this.Height.ToString();	
    //这一步很重要,不能隐式的去生成这个事件,就是不能直接在属性栏里面双击自动生成,
    //因为这个SizeChanged比获取窗口大小提前执行,不然会空引用异常。
    //InitializeComponent(),组件初始化,这个必须先执行,会触发SizeChanged,窗体大小
    this.SizeChanged += new EventHandler(Form1_SizeChanged); 
}


private void Form1_SizeChanged(object sender, EventArgs e)
{
	//这一步不必多说
	string[] tmp = ((Form)sender).Tag.ToString().Split(',');
	//比例因子
	float width = (float)((Form)sender).Width / (float)Convert.ToInt16(tmp[0]);
	float heigth = (float)((Form)sender).Height / (float)Convert.ToInt16(tmp[1]);
	//保存变化后的大小,下一次再根据这个求比例因子
	((Form)sender).Tag = ((Form)sender).Width.ToString() + "," + ((Form)sender).Height;
	//根据比例因子,重绘所有控件
	foreach (Control control in ((Form)sender).Controls)
	{
	    control.Scale(new SizeF(width, heigth));
	}
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值