精华内容
下载资源
问答
  • 2、把窗口属性WindowState改为Maximized 3、窗口中如果有panel则把的属性AutoSize改为TRUE 4、在窗口构造函数中实例化对象 AutoSizeFormClass asc = new AutoSizeFormClass(); 添加事件Load和事件SizeChanged并在...
  • 其实winform并不适合做自适应这玩意的,虽然,能做是能做,就像菜刀一样能切水果,但是,不是那么合适,毕竟有水果刀wpf做自适应拉伸窗体,会更好一些。代码: #region 自适应 private Size m_szInit;//初始窗体...

    其实winform并不适合做自适应这玩意的,虽然,能做是能做,

    就像菜刀一样能切水果,但是,不是那么合适,毕竟有水果刀

    wpf做自适应拉伸窗体,会更好一些。

    代码:

    #region 自适应
            private Size m_szInit;//初始窗体大小
            private Dictionary<Control, Rectangle> m_dicSize
                = new Dictionary<Control, Rectangle>();
    
            protected override void OnLoad(EventArgs e)
            {
                m_szInit = this.Size;//获取初始大小
                this.GetInitSize(this);
                base.OnLoad(e);
            }
    
            private void GetInitSize(Control ctrl)
            {
                foreach (Control c in ctrl.Controls)
                {
                    m_dicSize.Add(c, new Rectangle(c.locatio{过滤}n, c.Size));
                    this.GetInitSize(c);
                }
            }
    
            protected override void OnResize(EventArgs e)
            {
                //计算当前大小和初始大小的比例
                float fx = (float)this.Width / m_szInit.Width;
                float fy = (float)this.Height / m_szInit.Height;
                foreach (var v in m_dicSize)
                {
                    v.Key.Left = (int)(v.Value.Left * fx);
                    v.Key.Top = (int)(v.Value.Top * fy);
                    v.Key.Width = (int)(v.Value.Width * fx);
                    v.Key.Height = (int)(v.Value.Height * fy);
                }
                base.OnResize(e);
            }
            #endregion

     

    展开全文
  • 1.把自适应的类整体复制到你的工程命名空间里,这样做,每个窗体均可使用。 2.声明自适应类实例。 3.为窗体添加SizeChanged事件,并在其方法Form1_SizeChanged中,首次记录窗体和其控件初始位置和大小,之后调用类的...
  • 转载,原文链接改进C# WinForm窗体及其控件的自适应 按下面的四步走,直接将代码复制到 public partial class Form1 : Form {在此粘贴代码},即可实现控件自适应窗口的效果 //默认主窗口类名称为Form1,在此添加...

    转载,原文链接改进C# WinForm窗体及其控件的自适应
    按下面的四步走,直接将代码复制到
    public partial class Form1 : Form {在此粘贴代码},即可实现控件自适应窗口的效果

    //默认主窗口类名称为Form1,在此添加代码
    public partial class Form1 : Form
        {
        	public Form1()
            {
                InitializeComponent();
            }
    		
    		//从这里开始复制下面的代码!!!
    		//第一步,定义控件自适应窗口类AutoSizeFormClass
            class AutoSizeFormClass
            {
                public struct controlRect
                {
                    public int Left;
                    public int Top;
                    public int Width;
                    public int Height;
                }
                
                public List<controlRect> oldCtrl = new List<controlRect>();
                int ctrlNo = 0;
     			
     			//重要方法一:记录窗体和其控件的初始位置和大小controllInitializeSize()
                public void controllInitializeSize(Control mForm)
                {
                    controlRect cR;
                    cR.Left = mForm.Left; cR.Top = mForm.Top; cR.Width = mForm.Width; cR.Height = mForm.Height;
                    oldCtrl.Add(cR);
                    AddControl(mForm);
                }
                private void AddControl(Control ctl)
                {
                    foreach (Control c in ctl.Controls)
                    {  
                        controlRect objCtrl;
                        objCtrl.Left = c.Left; objCtrl.Top = c.Top; objCtrl.Width = c.Width; objCtrl.Height = c.Height;
                        oldCtrl.Add(objCtrl);                   
                        if (c.Controls.Count > 0)
                            AddControl(c);
                    }
                }
               
                //重要方法二:控件自适应大小方法controlAutoSize()
                public void controlAutoSize(Control mForm)
                {
                    if (ctrlNo == 0)
                    { 
                        controlRect cR;                    
                        cR.Left = 0; cR.Top = 0; cR.Width = mForm.PreferredSize.Width; cR.Height = mForm.PreferredSize.Height;
                        oldCtrl.Add(cR);
                        AddControl(mForm);
                    }
                    float wScale = (float)mForm.Width / (float)oldCtrl[0].Width;
                    float hScale = (float)mForm.Height / (float)oldCtrl[0].Height;
                    ctrlNo = 1;
                    AutoScaleControl(mForm, wScale, hScale);
                }
                private void AutoScaleControl(Control ctl, float wScale, float hScale)
                {
                    int ctrLeft0, ctrTop0, ctrWidth0, ctrHeight0;               
                    foreach (Control c in ctl.Controls)
                    {                
                        ctrLeft0 = oldCtrl[ctrlNo].Left;
                        ctrTop0 = oldCtrl[ctrlNo].Top;
                        ctrWidth0 = oldCtrl[ctrlNo].Width;
                        ctrHeight0 = oldCtrl[ctrlNo].Height;
                        
                        c.Left = (int)((ctrLeft0) * wScale);
                        c.Top = (int)((ctrTop0) * hScale);//
                        c.Width = (int)(ctrWidth0 * wScale);
                        c.Height = (int)(ctrHeight0 * hScale);//
                        ctrlNo++;
                        if (c.Controls.Count > 0)
                            AutoScaleControl(c, wScale, hScale);
    
                        if (ctl is DataGridView)
                        {
                            DataGridView dgv = ctl as DataGridView;
                            Cursor.Current = Cursors.WaitCursor;
    
                            int widths = 0;
                            for (int i = 0; i < dgv.Columns.Count; i++)
                            {
                                dgv.AutoResizeColumn(i, DataGridViewAutoSizeColumnMode.AllCells);  // 自动调整列宽  
                                widths += dgv.Columns[i].Width;   // 计算调整列后单元列的宽度和                       
                            }
                            if (widths >= ctl.Size.Width)  // 如果调整列的宽度大于设定列宽  
                                dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;  // 调整列的模式 自动  
                            else
                                dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;  // 如果小于 则填充  
    
                            Cursor.Current = Cursors.Default;
                        }
                    }
                }
            }
    
            //第二步,实例化上面定义的类
            AutoSizeFormClass asc = new AutoSizeFormClass();
            
            //第三步,初始化窗口时记录控件的大小和位置
            private void Form1_Load(object sender, EventArgs e)
            {
                asc.controllInitializeSize(this);
            }
    
            //第四步,主窗口大小发生变化触发的事件
            private void Form1_SizeChanged(object sender, EventArgs e)
            {
                asc.controlAutoSize(this);
            }
        }
    
    展开全文
  • C#窗体做自适应方法

    2020-12-10 17:12:34
    //窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用 } } //(3.2)控件自适应大小, public void controlAutoSize(Control mForm) { if (ctrlNo == 0) { //*如果在窗体的Form1_Load中,记录控件原始...

    方法如下:

    using log4net;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace 智慧工地大屏.util
    {
        public class AutoSizeFormClass
        {
            private static ILog logger = LogManager.GetLogger(typeof(AutoSizeFormClass));
    
            //(1).声明结构,只记录窗体和其控件的初始位置和大小。
            public struct controlRect
            {
                public int Left;
                public int Top;
                public int Width;
                public int Height;
            }
            //(2).声明 1个对象
            //注意这里不能使用控件列表记录 List nCtrl;,因为控件的关联性,记录的始终是当前的大小。
            //      public List oldCtrl= new List();//这里将西文的大于小于号都过滤掉了,只能改为中文的,使用中要改回西文
            public List<controlRect> oldCtrl = new List<controlRect>();
            int ctrlNo = 0;//1;
            //(3). 创建两个函数
            //(3.1)记录窗体和其控件的初始位置和大小,
            public void controllInitializeSize(Control mForm)
            {
                controlRect cR;
                cR.Left = mForm.Left; cR.Top = mForm.Top; cR.Width = mForm.Width; cR.Height = mForm.Height;
                oldCtrl.Add(cR);//第一个为"窗体本身",只加入一次即可
                AddControl(mForm);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用
                                  //this.WindowState = (System.Windows.Forms.FormWindowState)(2);//记录完控件的初始位置和大小后,再最大化
                                  //0 - Normalize , 1 - Minimize,2- Maximize
            }
            private void AddControl(Control ctl)
            {
                foreach (Control c in ctl.Controls)
                {  //**放在这里,是先记录控件的子控件,后记录控件本身
                   //if (c.Controls.Count > 0)
                   //    AddControl(c);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用
                    controlRect objCtrl;
                    objCtrl.Left = c.Left; objCtrl.Top = c.Top; objCtrl.Width = c.Width; objCtrl.Height = c.Height;
                    oldCtrl.Add(objCtrl);
                    //**放在这里,是先记录控件本身,后记录控件的子控件
                    if (c.Controls.Count > 0)
                        AddControl(c);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用
                }
            }
            //(3.2)控件自适应大小,
            public void controlAutoSize(Control mForm)
            {
                if (ctrlNo == 0)
                { //*如果在窗体的Form1_Load中,记录控件原始的大小和位置,正常没有问题,但要加入皮肤就会出现问题,因为有些控件如dataGridView的的子控件还没有完成,个数少
                  //*要在窗体的Form1_SizeChanged中,第一次改变大小时,记录控件原始的大小和位置,这里所有控件的子控件都已经形成
                    controlRect cR;
                    //  cR.Left = mForm.Left; cR.Top = mForm.Top; cR.Width = mForm.Width; cR.Height = mForm.Height;
                    cR.Left = 0; cR.Top = 0; cR.Width = mForm.PreferredSize.Width; cR.Height = mForm.PreferredSize.Height;
    
                    oldCtrl.Add(cR);//第一个为"窗体本身",只加入一次即可
                    AddControl(mForm);//窗体内其余控件可能嵌套其它控件(比如panel),故单独抽出以便递归调用
                }
                float wScale = (float)mForm.Width / (float)oldCtrl[0].Width;//新旧窗体之间的比例,与最早的旧窗体
                float hScale = (float)mForm.Height / (float)oldCtrl[0].Height;//.Height;
                ctrlNo = 1;//进入=1,第0个为窗体本身,窗体内的控件,从序号1开始
                AutoScaleControl(mForm, wScale, hScale);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用
            }
            private void AutoScaleControl(Control ctl, float wScale, float hScale)
            {
                int ctrLeft0, ctrTop0, ctrWidth0, ctrHeight0;
                //int ctrlNo = 1;//第1个是窗体自身的 Left,Top,Width,Height,所以窗体控件从ctrlNo=1开始
                foreach (Control c in ctl.Controls)
                { //**放在这里,是先缩放控件的子控件,后缩放控件本身
                  //if (c.Controls.Count > 0)
                  //   AutoScaleControl(c, wScale, hScale);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用
                    
                    ctrLeft0 = oldCtrl[ctrlNo].Left;
                    ctrTop0 = oldCtrl[ctrlNo].Top;
                    ctrWidth0 = oldCtrl[ctrlNo].Width;
                    ctrHeight0 = oldCtrl[ctrlNo].Height;
                    //c.Left = (int)((ctrLeft0 - wLeft0) * wScale) + wLeft1;//新旧控件之间的线性比例
                    //c.Top = (int)((ctrTop0 - wTop0) * h) + wTop1;
                    c.Left = (int)((ctrLeft0) * wScale);//新旧控件之间的线性比例。控件位置只相对于窗体,所以不能加 + wLeft1
                    c.Top = (int)((ctrTop0) * hScale);//
                    c.Width = (int)(ctrWidth0 * wScale);//只与最初的大小相关,所以不能与现在的宽度相乘 (int)(c.Width * w);
                    c.Height = (int)(ctrHeight0 * hScale);//
                   
                    ctrlNo++;//累加序号
                    //**放在这里,是先缩放控件本身,后缩放控件的子控件
                    if (c.Controls.Count > 0)
                        AutoScaleControl(c, wScale, hScale);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用
    
                    /*if (ctl is DataGridView)
                    {
                        DataGridView dgv = ctl as DataGridView;
                        Cursor.Current = Cursors.WaitCursor;
    
                        int widths = 0;
                        for (int i = 0; i < dgv.Columns.Count; i++)
                        {
                            dgv.AutoResizeColumn(i, DataGridViewAutoSizeColumnMode.AllCells);  // 自动调整列宽  
                            widths += dgv.Columns[i].Width;   // 计算调整列后单元列的宽度和                       
                        }
                        if (widths >= ctl.Size.Width)  // 如果调整列的宽度大于设定列宽  
                            dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;  // 调整列的模式 自动  
                        else
                            dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;  // 如果小于 则填充  
    
                        Cursor.Current = Cursors.Default;
                    }*/
                }
            }
            
            public float getWscale(Control mForm)
            {
                return (float)mForm.Width / (float)oldCtrl[0].Width;//新旧窗体之间的比例,与最早的旧窗体
            }
    
            public float getHscale(Control mForm)
            {
                return (float)mForm.Height / (float)oldCtrl[0].Height;//.Height;
            }
        }
    }
    
    

    调用如下:
    1.在窗体的加载方法中调用controllInitializeSize():该方法的作用是记录该窗体中所有控件的位置和大小。
    在这里插入图片描述

    2.在窗体的大小改变方法中调用controlAutoSize():该方法作用就是根据新窗体大小和旧窗体大小的比例计算所有控件的大小和位置。
    在这里插入图片描述

    彩蛋(新增子窗体和关闭Control中所有窗体或控件的方法):

    /// <summary>
    /// 添加子窗体方法
    /// </summary>
    private void OpenFrom(Form objFrm)
    {
        //将当前子窗体设置成非顶级控件
        objFrm.TopLevel = false;
        //设置窗体最大化
        objFrm.WindowState = FormWindowState.Maximized;
        //去掉窗体边框
        objFrm.FormBorderStyle = FormBorderStyle.None;
        //指定当前子窗体显示的容器
        objFrm.Parent = this.panelFrom;
        //显示窗体
        objFrm.Show();
    }
    
    /// <summary>
    /// 关闭已经打开的窗体\控件方法
    /// </summary>
    private void CloseFrom()
    {
        foreach (Control item in this.skinPanelChildForm.Controls)
        {
            if (item is Form objControl)
            {
    
                objControl.Close();
                this.skinPanelChildForm.Controls.Remove(item);
            }
    
        }
    }
    
    展开全文
  • C# Winform窗体自适应

    2021-04-23 10:58:15
    1.在From1.cs中输入如下代码 public Form1() { InitializeComponent(); x = this.Width; y = this.Height; setTag(this); } 其中setTag(this);为控件等比例缩放的方法 ...private void setTag..

    1.在From1.cs中输入如下代码 

    public Form1()
    {
        InitializeComponent();
        x = this.Width;
        y = this.Height;
        setTag(this);
    }

    其中setTag(this);为控件等比例缩放的方法 

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

    然后在Form1的属性中设置Resize方法

    private void Form1_Resize(object sender, EventArgs e)
    {
        float newx = (this.Width) / x;
        float newy = (this.Height) / y;
        setControls(newx, newy, this);
    }

    如果不需要字体的缩放可自行注释掉下面两行代码。 

    Single currentSize = System.Convert.ToSingle(mytag[4]) * newy;//字体大小
    con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit);

     

     

    展开全文
  • C# WinForm窗口自适应布局

    千次阅读 2019-06-22 15:31:37
    本文用一个实际布局案例,介绍了利用`Docker`和`Anchor`来实现一个自适应大小的界面布局,以及控件放置顺序对布局效果的影响。
  • (1)dock或者anchor,命令控件在调整大小时动作的两个属性就是“Dock”和“Anchor”。为每个控件设置anchor是可行的。 Dock和Anchor通过将控件连接到它们父窗体的某个位置,而免除了使应用程序具有不可预知界面的...
  • C# 设置窗体自适应屏幕分辨率

    千次阅读 2018-10-22 11:10:29
     /// 自适应屏幕分辨率  /// &lt;/summary&gt;  /// &lt;param name="form"&gt;窗体对象&lt;/param&gt;  public static void InitInstance(System.Windows.Forms.UserControl...
  • 让希望变化的控件为百分比大小即可,就像这样 这样,C#窗体就可以随意的拖拉拽,而不用写死大小了,更不用担心放到别人电脑上显示不开的情况了。 到这里为止,软件就已经可以自由托拉拽调整大小啦,如果要实现直接...
  •  2012-11-30 曾经写过 《C# WinForm窗体及其控件自适应各种屏幕分辨率》 ,其中也讲解了控件自适应的原理。近期有网友说,装在panel里面的控件,没有效果?  这是控件嵌套的问题,加入即可实现。使用皮肤时,要注意...
  • winform窗口自适应

    2018-10-17 13:04:16
    winform窗口自适应代码,c#winform资源,解压即可使用
  • c#写的自适应尺寸窗体的监视类。可以用Regist和UnRegist监视和取消是否让被监视的窗体自动缩放。
  • C# WinForm窗体及其控件自适应各种屏幕分辨率一。说明 我们自己编写程序的界面,会遇到各种屏幕分辨率,只有自适应才能显的美观。实际上,做到这点也很简单,就是首先记录窗体和它上面控件的初始位置和大小,当窗体...
  • WinForm窗体及其控件的自适应,对于容器内的控件同样有效
  • C# 窗口背景图片自适应

    千次阅读 2020-07-13 13:16:02
    一、有两种方法 1.选中窗体修改属性 2.在load添加代码 private void Form1_Load(object sender, EventArgs e) { this.BackgroundImageLayout = ImageLayout.Stretch; }
  • Halcon图像自适应窗口控件显示,以窗口中心为基准按比例适应大小 halcon的代码;以及鼠标缩放平移图像 C++的代码
  • 窗体自适应,统计原始窗体的位置和大小;缩放后Resize通过计算主窗体的大小,计算出长宽伸缩比例,然后再计算出来内部控件的起始点和长宽,过程通过递归完成,简单易行!
  • 用tableLayoutPanel加panel能不能做到自适应布局呢?(保证布局不跑偏) b.如果a成立那么里面的控件如何做到按照屏幕分辨率等比缩放呢,比如1920*1080的开发环境放到1366*768等这种情况 我的想法是,既然屏幕分辨率和...
  • C#自适应窗体大小

    千次阅读 2018-10-12 16:32:22
    System.Drawing.Rectangle rect = Screen.GetWorkingArea(this);... //用于固定启动程序是窗口的左上角的位置, 这样获取到了屏幕的尺寸,之后所设计控件的布局时要根据其比例大小去设计(代码写到加载函数中)。
  • WinForm窗体及其控件的自适应,winform控件随窗口自适应,C#源码
  • 下载后解压缩即可运行使用,代码...3.为窗体添加SizeChanged事件,并在其方法Form1_SizeChanged中,首次记录窗体和其控件初始位置和大小,之后调用类的自适应方法,完成自适应。 4.Panel,DataGridView等控件同样适用。
  • 1 近期做项目时,遇到开发的winform在自己电脑上可以正常显示,共享到其他电脑就事儿不能显示了: 2 3 1.当两个电脑分辨率相同时,无法显示完全,请检查form的autoscalemode属性是否为none,并设为none ...
  • 我们自己编写程序的界面,会遇到各种屏幕分辨率,只有自适应才能显的美观。实际上,做到这点也很简单,就是首先记录窗体和它上面控件的初始位置和大小,当窗体改变比例时,其控件的位置和大小也按此比例变化即可。...
  • C# winform 控件自适应窗体大小

    千次阅读 2018-07-12 17:36:55
    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows.Forms;namespace videoBox.lib{ public class AutoSizeFormClass { public struct con...
  • 该案例实现的是多个子窗口在父级窗口自适应显示,使用的软件版本vs2010,希望这个案列可以帮助到到大家
  • C#窗体控件自适应缩放

    千次阅读 2018-04-13 14:56:54
    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.F...
  • C#中 TextBox自适应高度

    千次阅读 2013-05-31 17:24:28
    文本框根据输入内容自适应高度</title> <style type="text/css"> #textarea { font: 1.4em/1.8em Arial; overflow: hidden; width: 550px; height: 6em; padding:10px; } </style> ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,107
精华内容 842
关键字:

c#窗口自适应

c# 订阅