winform窗体程序适应不同的分辨率

如何让自己编写的winform窗体应用程序适应不同的分辨率

解决思路:

1、窗体加载时获取窗体的长x1和宽y1;

2、使用窗体的Resize()事件,当窗体尺寸发生变化时,获得窗体变化后的长x2和宽y2,将x2/x1得到kx,将y2/y1得到ky

3、遍历窗体中的所有控件,将控件的位置,大小,字体大小按照kx和ky比例进行调整;

复制代码
namespace AutoFitDemo
{
    public partial class Form1 : Form
    {
        //如何实现winform窗体在不同分辨率下的自适应
        //解决思路,根据窗体的缩放比例,调整窗体中每个控件的位置、尺寸和字体的大小
        //需要注意的是,panel,tableLayoutPanel下的控件需要通过递归的方法取得控件
        float x, y;
        public Form1()
        {
            InitializeComponent();
            x=this.Width;
            y=this.Height;
            this.Resize += Form1_Resize;
            this.Load += Form1_Load;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            setTag(this);
        }

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

        private void setControls(float kx, float ky, Control cons)
        {
            foreach (Control con in cons.Controls)
            {
                string[] tag = con.Tag.ToString().Split(';');
                con.Width =Convert.ToInt32(Convert.ToSingle(tag[0])*kx);
                con.Height =Convert.ToInt32(Convert.ToSingle(tag[1])*ky);
                con.Left =Convert.ToInt32(Convert.ToSingle(tag[2])*kx);
                con.Top =Convert.ToInt32(Convert.ToSingle(tag[3])*ky);
                con.Font=new Font (con.Font.Name, Convert.ToSingle(tag[4])*kx ,con.Font.Style,con.Font.Unit);
                if (con.Controls.Count>0)
                {
                    setControls(kx, ky, con);
                }
            }
        }

        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);
                }
                Console.WriteLine(con.Name);
            }
        }
    }
}
复制代码

 

效果:

原始窗体:

调整窗体的长宽后:

 

 

posted on   hanzq_go  阅读(1517)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示