winform 重载Form类 窗体控件能自动按比例显示

winform 重载Form类 窗体控件能自动按比例显示

在我们开发桌面软件时,我们常碰到窗体的大小是不固定的,在用户拉升缩放form的时候,一些控件就看不到了.整个form的内容都随之变形走样了.为了适应开发的需求,对Form基类进行了重载.这样就可以实现

winform 重载Form类 窗体控件能自动按比例显示

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Text;

namespace System.Windows.Forms
{
    public class GoodForm:Form
    {
        double formoldwidth;    //窗体原始宽度  
        double formoldheight;   //窗体原始高度

        protected override void OnLoad(EventArgs e)
        {
            base.OnResize(e);
            double scalewh;     //控件宽高比   
            formoldwidth = (double)this.Width;
            formoldheight = (double)this.Height;
            foreach (Control ctrl in this.Controls)
            {
                scalewh = (double)ctrl.Width / (double)ctrl.Height;
                ctrl.Tag = ctrl.Left + " " + ctrl.Top + " " + ctrl.Width + " " + scalewh.ToString() + " ";     //将控件的Left,Top,Width,宽高比放入控件的Tag内              
            }  
        }

        protected override void OnResize(EventArgs e)
        {
            base.OnResize(e);
            double scalex;  //水平伸缩比  
            double scaley;  //垂直伸缩比  
            long i;
            int temppos;
            string temptag;
            double[] pos = new double[4];   //pos数组保存当前控件的left,top,width,height   

            scalex = (double)this.Width / formoldwidth;
            scaley = (double)this.Height / formoldheight;
            foreach (Control ctrl in this.Controls)
            {
                if (ctrl.Tag != null)
                {
                    temptag = ctrl.Tag.ToString();
                    for (i = 0; i <= 3; i++)
                    {
                        temppos = temptag.IndexOf(" ");
                        if (temppos > 0)
                        {
                            pos[i] = Convert.ToDouble(temptag.Substring(0, temppos));   //从Tag中取出参数  
                            temptag = temptag.Substring(temppos + 1);
                        }
                        else
                            pos[i] = 0;
                    }
                    ctrl.Left = (int)(pos[0] * scalex);
                    ctrl.Top = (int)(pos[1] * scaley);
                    ctrl.Width = (int)(pos[2] * scalex);
                    ctrl.Height = (int)((double)ctrl.Width / pos[3]);   //高度由宽高比算出  
                }
            }
        }
    }
}
 




评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.