精华内容
下载资源
问答
  • 2021-04-23 10:58:15

    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);

     

     

    更多相关内容
  • winform窗口自适应

    2018-10-17 13:04:16
    winform窗口自适应代码,c#winform资源,解压即可使用
  • 本来不爱鸡汤,今天说两句:winform开发有一个缺陷就是不能实现界面自适应,切换不同的分辨率,或者窗体大小改变就会出现窗体显示不全的问题。这就需要自己写一个方法来实现不同情况下的自适应,WPF比Winform的一...

    今天给大家上一道硬菜。本来不爱鸡汤,今天说两句:winform开发有一个缺陷就是不能实现界面的自适应,切换不同的分辨率,或者窗体大小改变就会出现窗体显示不全的问题。这就需要自己写一个方法来实现不同情况下的自适应,WPF比Winform的一个显著优势就是可以实现自适应。今天给大家一个可以实现自适应的方案。(本篇博客代码,为本人,在本地调试通过后,手敲到博客中,难免出现敲错的状况,勿喷。代码里面的注释是比较清楚的)

    效果图:

     

    调整大小后

    新建一个AutoSizeFormClass.cs文件

    class AutoSizeFormClass
    {
        //1.声明一个结构体,记录窗体和控件的基本属性
        public struct controlRect
        {
            public string Name;
            public int Left;
            public int Top;
            public int Width;
            public int Height;
            public float FontSize;
            public FontFamily FontFamily;
        }
        //2.声明一个集合记录所有控件的属性
        //使用控件的Name作为key
        Dictionary<string,controlRect> dic=new Dictionary<string,controlRect>();
        int ctrNo=0;
        //这里是你开发环境下的分辨率
        private int ScW=1920;
        private int ScH=1080;
        //记录窗体是不是第一次加载的标记 0:第一次加载  1:重复加载
        private int IsFirstLoad=0;
        //窗体的名称
        private string FrmName=string.Empty;
        //3.创建两个函数
        //采用递归的方法将控件包含的所有控件属性记录下来(结构体的每一个属性都需要赋值)
        private void AddControl(Control ctl)
        {
            foreach(Control c in ctl.Controls)
            {
                GetCtrParameter(c);
                //使用递归函数先记录控件本身,后记录控件包含的子控件
                if(c.Controls.Count>0)
                {
                    AddControl(c);
                }
            }
        }
        //获取控件的所有属性
        private void GetCtrParameter(Control mForm)
        {
            controlRect cr;
            cr.Name=mForm.Name;
            cr.Left=mForm.Left;
            cr.Top=mForm.Top;
            cr.Width=mForm.Width;
            cr.Height=mForm.Height;
            cr.FontSize=mForm.Font.Size;
            cr.FontFamily=mForm.Font.FontFamily;
            dic.Add(cr.Name,cr);
        }
    
        //4.控件自适应大小
        public void controlAutoSize(Control mForm)
        {
            FrmName=mForm.Name;
            float wScale=0;
            float hScale=0;
            //因为有些控件和DataGridView的子空间加载时间较长,所以在Form1_SizeChanged中,
            //记录控件的原始大小和位置,第一次加载的时候先根据和开发环境的像素比例绘制窗体                
            if(IsFirstLoad==0&&ctrNo==0)
            {
                //获取当前的像素
                int SH=Screen.PrimaryScreen.Bounds.Height;
                int SW=Screen.PrimaryScreen.Bounds.Width;
                //和开发环境的像素相比获取对应的比值
                wScale=(float)SH/(float)ScH;
                hScale=(float)SW/(float)ScW;
                controlRect cR;
                cR.Name=mForm.Name;
                cR.Left=mForm.Left;
                cR.Top=mForm.Top;
                cR.Width=mForm.Width;
                cR.Height=mForm.Height;
                cR.FontSize=mForm.Font.Size;
                cR.FontFamily=mForm.Font.FontFamily;
                dic.Add(cR.Name,cR);//第一个为窗体本身
                AddControl(mForm);//递归获取所有窗体基础信息
                AutoScaleControl(mForm,wScale,hScale);//这里其实是第一次构造窗体
                IsFirstLoad=1;            
            }
            //这里是改变窗体大小时重新设置窗体的属性
            else
            {
                //新旧窗体之间的高和长的比例,与第一次加载的信息比较
                wScale=(float)mForm.Width/dic[FrmName].Width;
                hScale=(float)mForm.Height/dic[FrmName].Height;
                //将ctrNo设为1,代表为控件而非窗体
                ctrNo=1;
                //设置控件以及其嵌套的控件的比例大小,使用递归调用
                AutoScaleControl(mForm,wScale,hScale);
            }
        }
        //递归进行自适应调整
        private void AutoScaleControl(Control ctl,float wScale,float hScale)
        {
            int ctrLeft0,ctrTop0,ctrWidth0,ctrHeight0;
            float fontSize;
            FontFamily fontFamily;
            foreach(Control c in ctl.Controls)
            {
                string ctrName=c.Name;
                ctrLeft0=dic[ctrName].Left;
                ctrTop0=dic[ctrName].Top;
                ctrWidth0=dic[ctrName].Width;
                ctrHeight0=dic[ctrName].Height;
                fontSize=dic[ctrName].FontSize;
                fontFamily=dic[ctrName].FontFamily;
                //新旧控件之间的线性比例,字体大小依据高度转换
                c.Left=(int)(ctrLeft0*wScale);
                c.Top=(int)(ctrTop0*hScale);
                c.Width=(int)(ctrWidth0*wScale);
                c.Height=(int)(ctrHeight0*hScale);
                c.Font=new Font(fontFamily,fontSize*hScale);
                ctrNo++;
                //先缩放控件本身,后缩放控件的子控件
                if(c.Controls.Count>0)
                {
                    AutoScaleControl(c,wScale,hScale);
                }
                //dataGridview特殊处理
                if(c is DataGridView)
                {
                    DataGridView dgv=c as DataGridView;
                    Cursor.Current=Cursors.WaitCursor;
                    int widths=0;
                    for(int i=0;i<dgv.Columns.Count-1;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;
                }
            }
        }
    
    }
    

    添加一个Form1,在SizeChanged方法添加,不要在load中添加

    public partial class Form1:Form
    {
        private AutoSizeFormClass asc=new AutoSizeFormClass();
        public Form1()
        {
            InitializeComponent();
        } 
        private void Form1_SizeChanged(object sender,EventArgs e)
        {
            asc.controlAutoSize(this);
        }
    }

     

     

     

    展开全文
  • 1.把自适应的类整体复制到你的工程命名空间里,这样做,每个窗体均可使用。 2.声明自适应类实例。 3.为窗体添加SizeChanged事件,并在其方法Form1_SizeChanged中,首次记录窗体和其控件初始位置和大小,之后调用类的...
  • C# WinForm窗口自适应布局

    千次阅读 2019-06-22 15:31:37
    本文用一个实际布局案例,介绍了利用`Docker`和`Anchor`来实现一个自适应大小的界面布局,以及控件放置顺序对布局效果的影响。

    【转载请注明出处:https://blog.csdn.net/Leytton/article/details/92447713】

    如果本文对您有所帮助,请点个赞让我知道哦 😃
    本文用一个实际布局案例,介绍了利用DockerAnchor来实现一个自适应大小的界面布局,以及控件放置顺序对布局效果的影响。
    我们从一张图开始说起,如下图所示,窗体调整大小时,C处列表组件会自动缩放填充满。

    在这里插入图片描述
    这是缩小后的界面:
    在这里插入图片描述
    布局属性:
    A MenuStrip 菜单控件,Docker属性为Top
    B Panel 面板控件,Docker属性为Top
    C ListVIew 列表控件,Docker属性为Fill
    D StatusStrip 状态控件,Docker属性为Bottom

    其他:
    全选按钮:Docker属性为NoneAnchor属性为Top, Left
    开启按钮:Docker属性为NoneAnchor属性为Top, Right
    停止按钮:Docker属性为NoneAnchor属性为Top, Right

    说明下:
    1、Docker属性为None时,Anchor属性才有效
    2、Anchor可以理解为停靠依附,就像用钉子定住了一样,属性为Top, Right则无论怎样调整窗口大小,控件与父控件上方、右方的距离永远不变,其它属性类似。
    3、DockerFill属性则会填满父控件,为Top时就会从父控件的顶部开始填充一定高度,但是,会按底层控件先填充的原则,所以控件放置的先后顺序会对填充效果造成影响。
    比如:
    如下图所示,把 B控件(Docker属性为Top)置于底层,则B控件的位置移到了最上面:
    在这里插入图片描述
    如下图所示,把C控件(Docker属性为Fill)置于底层,则C控件的顶部被其他控件遮挡:
    在这里插入图片描述

    展开全文
  • 1.建立一个winform项目 2.拖动控件后,对界面进行布局 3.代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq;...

    当窗体大小变化时,窗体内的控件随着窗体的变化而变化。

    1.建立一个winform项目

    2.拖动控件后,对界面进行布局

    3.代码

    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.Forms;
    
    namespace WindowsFormsApp1
    {
        public partial class Form1 : Form
        {
            private float X;//当前窗体的宽度
            private float Y;//当前窗体的高度
            public Form1()
            {
                InitializeComponent();
            }
    
            /// <summary>
            /// 将控件的宽,高,左边距,顶边距和字体大小暂存到tag属性中
            /// </summary>
            /// <param name="cons">递归控件中的控件</param>
            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);
                }
            }
    
            /// <summary>
            /// 根据窗体大小调整控件大小
            /// </summary>
            /// <param name="newx">窗体宽度缩放比例</param>
            /// <param name="newy">窗体高度缩放比例</param>
            /// <param name="cons">随窗体改变控件大小</param>
            private void setControls(float newx, float newy, Control cons)
            {
                //遍历窗体中的控件,重新设置控件的值
                foreach (Control con in cons.Controls)
                {
    
                    string[] mytag = con.Tag.ToString().Split(new char[] { ':' });//获取控件的Tag属性值,并分割后存储字符串数组
                    float a = System.Convert.ToSingle(mytag[0]) * newx;//根据窗体缩放比例确定控件的值,宽度
                    con.Width = (int)a;//宽度
                    a = System.Convert.ToSingle(mytag[1]) * newy;//高度
                    con.Height = (int)(a);
                    a = System.Convert.ToSingle(mytag[2]) * newx;//左边距离
                    con.Left = (int)(a);
                    a = System.Convert.ToSingle(mytag[3]) * newy;//上边缘距离
                    con.Top = (int)(a);
                    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);
                    }
                }
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                X = this.Width;//获取窗体的宽度
                Y = this.Height;//获取窗体的高度
                setTag(this);//调用方法
    
            }
    
            private void Form1_Resize(object sender, EventArgs e)
            {
                float newx = (this.Width) / X; //窗体宽度缩放比例
                float newy = (this.Height) / Y;//窗体高度缩放比例
                setControls(newx, newy, this);//随窗体改变控件大小
            }
        }
    }
    

     4.效果

    感谢某QQ群的人提供。 

    展开全文
  • 在做YH的时候,为了扩展界面的功能区域...改回去太麻烦了,只好写了一个自适应分辨率的类,来解决这一问题。多的不说了,直接上代码吧。using System;using System.Collections.Generic;using System.Drawing;using...
  • C#——WinForm窗体自适应分辨率

    千次阅读 2019-12-03 11:07:17
    我们自己编写程序的界面,会遇到各种屏幕分辨率,只有自适应才能显的美观。实际上,做到这点也很简单,就是首先记录窗体和它上面控件的初始位置和大小,当窗体改变比例时,其控件的位置和大小也按此比例变化即可。...
  • 1.项目情况:项目使用winform搭建,禁用用户放大缩小,一直全屏展示 2.问题: a.用tableLayoutPanel加panel能不能做到自适应布局呢?(保证布局不跑偏) b.如果a成立那么里面的控件如何做到按照屏幕分辨率等比缩放呢,...
  • } } 经过上述几个步骤,即可实现窗体的自由缩放,它的基本思想是:通过对控件的尺寸进行重置来实现窗体的自适应。即,先将原窗体的初始值进行存储,然后通过SizeChange事件响应窗体改变,实现重绘。 需要注意的是:...
  • 我们自己编写程序的界面,会遇到各种屏幕分辨率,只有自适应才能显的美观。实际上,做到这点也很简单,就是首先记录窗体和它上面控件的初始位置和大小,当窗体改变比例时,其控件的位置和大小也按此比例变化即可。...
  • 有时候在台式机上写好的winform程序,换了台电脑,控件什么的都变形了,修改如下 打开注册表,找到这个路径: HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers 右侧添加一...
  • WinForm窗体自适应

    2016-12-05 22:43:00
    首先贴出 Rocky 博客上的自适应代码: AutoSizeFormClass.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System....
  • 1、加工程中加入AutoSizeFormClass.cs 2、把窗口属性WindowState改为Maximized 3、窗口中如果有panel则把的属性AutoSize改为TRUE 4、在窗口构造函数中实例化对象 AutoSizeFormClass asc = new AutoSizeFormClass();...
  • 特别注意的是:在显示设置中的文本大小应该为100%,否则虽然你代码写分辨率,不管是写死还是读xml,效果与你预测的不一样。
  • Winform 窗体控件最大化自适应

    千次阅读 2019-09-17 15:42:52
    <div class="htmledit_views" id="content_views"> <p>运行窗体效果如下:</p> <p><img alt="" class="has" height="445" src="https://img-blog.c...
  • WinForm碰到不同分辨率的时候,如何设计才能自适应?包括DevExpress控件2分你看看photoshop遇到不同分辨率的显示,如何布局,就知道了。5分你的自适应指的什么,如果是为了不错位,遮挡等,就设置dock或anchors自动...
  • 我们自己编写程序的界面,会遇到各种屏幕分辨率,只有自适应才能显的美观。实际上,做到这点也很简单,就是首先记录窗体和它上面控件的初始位置和大小,当窗体改变比例时,其控件的位置和大小也按此比例变化即可。...
  • 说明 2012-11-30 曾经写过 《C# WinForm窗体及其控件自适应各种屏幕分辨率》 ,其中也讲解了控件自适应的原理。近期有网友说,装在panel里面的控件,没有效果?这是控件嵌套的问题,加入即可实现。使用皮肤时,要...
  • 启动exe,并在winform panel中嵌入对应窗体,并实现其窗口大小随panel变化,最后程序退出时也要退出exe对应的进程。
  • 在做YH的时候,为了扩展界面的功能区域,使得更为方便的使用系统,所以对界面的大小进行了扩充。随之而来的分辨率问题也就来了。功能写完了,但是现在又在原来的界面上显示不全。改回去太麻烦了,只好写了一个自适应...
  • } } } } } 2、在form加载界面写入 /// /// 声明一个窗体自适应分辨率类 /// private AutoSize As = new AutoSize(); /// /// 在窗体的SizeChanged事件中调用controlAutoSize(this) /// 在窗体的load事件中调用As....
  • 而后放置16个 Button 控件 ,调整合适大小(可以按住Ctrl拖动来复制控件),并将每个Button的Text设置好对应的值 三: 主要代码 3.1 按钮自适应屏幕大小 这部分的操作主要针对于多个控件的情况,需要通过编码的形式...
  • C# :Winform控件随窗体大小的改变而自适应窗体

    千次阅读 热门讨论 2021-01-20 09:20:50
    前言: 在把窗体进行最大化时,窗体内的空间大小并不会随之而改变,用户体验感大大降低。 解决方法: 找到窗体中控件的属性:Anchor Anchor定义控件的定位点位置,如果窗体的大小被改变,控件与定位点之间的位置...
  • C# WinForm窗体及其控件自适应各种屏幕分辨率一。说明  我们自己编写程序的界面,会遇到各种屏幕分辨率,只有自适应才能显的美观。实际上,做到这点也很简单,就是首先记录窗体和它上面控件的初始位置和大小,当...
  • namespace Test_Tank_Scout { public class exe2Winform { #region 字段 /* Application.Idle:当应用程序完成处理并即将进入空闲状态时发生 -->appIdleEvent:要处理的事件 -->订阅了Application_Idle:确保应用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 564
精华内容 225
关键字:

winform界面自适应