C#winform设置窗体自动缩放适应不同尺寸的电脑屏幕大小 适应不同的分辨率

C#winform设置窗体自动缩放适应不同尺寸的电脑屏幕大小 适应不同的分辨率 (带dataGridView控件)

解决dataGridView控件不能调整行高的问题

由于用户屏幕大小不同分辨率和缩放比例不同,固定大小的窗体不能满足所有人的需求,窗体缩放就成为了一个困扰,我在网上寻找过多种方法,以下方法最好用,再次对该贴作者表示感谢。

另外由于软件需求原先的代码无法做到dataGridView,listView等表格性的控件里面  列宽,行高,字体大小  做出相应改变,所以本人进行了相应的修改,以下代码以dataGridViewInfo为例做了个示范:

其他控件具体问题具体分析,希望以下代码能帮助到你。



一、控件准备

1.  首先在窗体上放上一个Panel容器,并将容器的Dock属性设为Fill,即所有的控件都放在了这个容器里。

二、代码准备

#region控件缩放

        double formWidth;//窗体原始宽度

        double formHeight;//窗体原始高度

        double scaleX;//水平缩放比例

        double scaleY;//垂直缩放比例

        double HeadersHeight;//dataGridView抬头高度

        double RowTemplateHeight;//dataGridView行高

        DictionarycontrolInfo = new Dictionary();//控件中心Left,Top,控件Width,控件Height,控件字体Size

//添加了dategridview的

    //dataGridViewInfo

        List dataGridViewInfo = newList();//dataGridView每列的宽度顺序一一对应。


        ///

        ///获取所有原始数据

        ///

        protected void GetAllInitInfo(ControlCrlContainer)

        {

            if (CrlContainer.Parent == this)

            {

                formWidth = Convert.ToDouble(CrlContainer.Width);

                formHeight =Convert.ToDouble(CrlContainer.Height);

            }

            foreach (Control item inCrlContainer.Controls)

            {

                if (item.Name.Trim() !="")

                    controlInfo.Add(item.Name,(item.Left + item.Width / 2) + "," + (item.Top + item.Height / 2) +"," + item.Width + "," + item.Height + "," +item.Font.Size);


                if(item.Name.Contains("dataGridView"))

                {

                    for (int i = 0; i

                    {

                       dataGridViewInfo.Add(Convert.ToInt32(this.dataGridView1.Columns[i].Width));

                    }


                    HeadersHeight =this.dataGridView1.ColumnHeadersHeight;

                    RowTemplateHeight =this.dataGridView1.RowTemplate.Height;

                }


                if ((item as UserControl) ==null && item.Controls.Count > 0)

                    GetAllInitInfo(item);

            }

        }

        private void ControlsChangeInit(ControlCrlContainer)

        {

            scaleX =(Convert.ToDouble(CrlContainer.Width) / formWidth);

            scaleY =(Convert.ToDouble(CrlContainer.Height) / formHeight);

        }

        private void ControlsChange(ControlCrlContainer)

        {

            try

            {

                double[] pos = newdouble[5];//pos数组保存当前控件中心Left,Top,控件Width,控件Height,控件字体Size

                foreach (Control item inCrlContainer.Controls)

                {

                    if (item.Name.Trim() !="")

                    {

                        if ((item asUserControl) == null && item.Controls.Count > 0)

                           ControlsChange(item);

                        string[] strs =controlInfo[item.Name].Split(',');

                        for (int j = 0; j <5; j++)

                        {

                            pos[j] =Convert.ToDouble(strs[j]);

                        }

                        double itemWidth = pos[2] * scaleX;

                        double itemHeight =pos[3] * scaleY;

                        item.Left =Convert.ToInt32(pos[0] * scaleX - itemWidth / 2);

                        item.Top =Convert.ToInt32(pos[1] * scaleY - itemHeight / 2);

                        item.Width =Convert.ToInt32(itemWidth);

                        item.Height =Convert.ToInt32(itemHeight);


                        //if(!item.Name.Contains("dataGridView"))

                        item.Font = newSystem.Drawing.Font(item.Font.Name, float.Parse((pos[4] * Math.Min(scaleX,scaleY)).ToString()));


                        //gridview行宽列宽修改

                        if(item.Name.Contains("dataGridView"))

                        {

                            //dataGridView1.AutoSizeColumnsMode =DataGridViewAutoSizeColumnsMode.AllCells;

                           //DataGridView1.ColumnCount列

                            for (int i = 0; i< dataGridViewInfo.Count; i++)

                            {

                               this.dataGridView1.Columns[i].Width =Convert.ToInt32(dataGridViewInfo[i] * scaleX);


                            }

                            //设置自动调整解决行高不能设置的问题

                           dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;

                           //this.dataGridView1.ColumnHeadersHeight = Convert.ToInt32(HeadersHeight* scaleY);

                           //this.dataGridView1.RowTemplate.Height =Convert.ToInt32(RowTemplateHeight * scaleY);//待改进小行字体不一致

                           //this.dataGridView1.RowTemplate.DefaultCellStyle.Font = newSystem.Drawing.Font(item.Font.Name, float.Parse((pos[4]).ToString()));

                           //this.dataGridView1.RowTemplate.MinimumHeight =Convert.ToInt32(RowTemplateHeight * scaleY);

//***在控件界面设置行自适应即可dataGridView1.AutoSizeRowsMode =

DataGridViewAutoSizeRowsMode.AllCells;

                        }

                    }

                }

            }

            catch(Exception ex)

            { }

        }

        #endregion


        //3.在新建的窗体类中重写OnSizeChanged事件,并调用ControlsChangeInit和ControlsChange方法,代码如下:


        protected override voidOnSizeChanged(EventArgs e)

        {

            base.OnSizeChanged(e);

            if (controlInfo.Count > 0)

            {

               ControlsChangeInit(this.Controls[0]);

               ControlsChange(this.Controls[0]);

            }

        }


//调用函数

publicForm2()

        {

            InitializeComponent();

            GetAllInitInfo(this.Controls[0]);

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容