【Winform】panel内显示多个子form切换显示

类似NavigationFrame可翻页

1.panel显示子窗体

public partial class MainForm : Form
    {
        Form1 frm1 = new Form1();
        Form2 frm2 = new Form2();
        Form3 frm3 = new Form3();

        public MainForm()
        {
            InitializeComponent();
        }

        private void button_page1_Click(object sender, EventArgs e)
        {
            if (!this.panel1.Controls.Contains(frm1))   //如果panel中不包含form1,就将它添加到Panel中
            {
                frm1.TopLevel = false;  //将form1的TopLevel设为false,否则无法在panel中显示顶级窗体
                frm1.FormBorderStyle = FormBorderStyle.None;    //不显示边框
                this.panel1.Controls.Add(frm1); //form1添加到panel中
                frm1.Show();    //显示
            }
            frm1.BringToFront();    //后添加的form会被前面添加的form挡住,所以每次显示时要放到最前
        }

        private void button_page2_Click(object sender, EventArgs e)
        {
            if (!this.panel1.Controls.Contains(frm1))   
            {
                frm2.TopLevel = false;  
                frm2.FormBorderStyle = FormBorderStyle.None;    
                this.panel1.Controls.Add(frm2); 
                frm2.Show();    
            }
            frm2.BringToFront();    
        }

        private void button_page3_Click(object sender, EventArgs e)
        {
            if (!this.panel1.Controls.Contains(frm1))
            {
                frm3.TopLevel = false;
                frm3.FormBorderStyle = FormBorderStyle.None;
                this.panel1.Controls.Add(frm3);
                frm3.Show();
            }
            frm3.BringToFront();
        }
    }

2.子窗体大小自适应

  • 计算比例:p=容器/控件
  • 新控件width=px*width,height=py*height
  • 子窗体内有控件,对控件内的控件进行递归设置大小,直到没有内部没有子控件的控件。
Form1 frm1 = new Form1();
        Form2 frm2 = new Form2();
        Form3 frm3 = new Form3();

        public MainForm()
        {
            InitializeComponent();
        }

        private void button_page1_Click(object sender, EventArgs e)
        {
            if (!this.panel1.Controls.Contains(frm1))   //如果panel中不包含form1,就将它添加到Panel中
            {
                frm1.TopLevel = false;  //将form1的TopLevel设为false,否则无法在panel中显示顶级窗体
                frm1.FormBorderStyle = FormBorderStyle.None;    //不显示边框
                this.panel1.Controls.Add(frm1); //form1添加到panel中
                frm1.Show();    //显示

                selfAdoption(frm1, this.panel1);
            }
            frm1.BringToFront();    //后添加的form会被前面添加的form挡住,所以每次显示时要放到最前
        }

        private void button_page2_Click(object sender, EventArgs e)
        {
            if (!this.panel1.Controls.Contains(frm2))   
            {
                frm2.TopLevel = false;  
                frm2.FormBorderStyle = FormBorderStyle.None;    
                this.panel1.Controls.Add(frm2); 
                frm2.Show();

                selfAdoption(frm2, this.panel1);

            }
            frm2.BringToFront();    
        }

        private void button_page3_Click(object sender, EventArgs e)
        {
            if (!this.panel1.Controls.Contains(frm3))
            {
                frm3.TopLevel = false;
                frm3.FormBorderStyle = FormBorderStyle.None;
                this.panel1.Controls.Add(frm3);
                frm3.Show();

                selfAdoption(frm3, this.panel1);
            }
            frm3.BringToFront();
        }

        public void selfAdoption(Control con, Control objectCon)
        {
            float proportionX = objectCon.Width / Convert.ToSingle(con.Width);  //计算比例
            float proportionY = objectCon.Height / Convert.ToSingle(con.Height);
            SetControl(proportionX, proportionY, con);
        }
        
        /// <summary>
        /// 按照比例缩放控件大小
        /// </summary>
        /// <param name="proportionX">宽度比例</param>
        /// <param name="proportionY">高度比例</param>
        /// <param name="con">控件</param>
        public void SetControl(float proportionX, float proportionY, Control con)
        {
            foreach (Control ctl in con.Controls)
            {
                //修改子窗体尺寸
                ctl.Width = Convert.ToInt32(proportionX * ctl.Width);
                ctl.Height = Convert.ToInt32(proportionY * ctl.Height);
                //相对位置调整
                ctl.Left = Convert.ToInt32(ctl.Left * proportionX);
                ctl.Top = Convert.ToInt32(ctl.Top * proportionY);

                //递归修改子窗体内部控件尺寸
                if (ctl.Controls.Count > 0)  //子窗体内部有控件
                {
                    SetControl(proportionX, proportionY, ctl);  
                }
            }
        }
posted @ 2023-05-14 14:04  徘徊彼岸花  阅读(266)  评论(0编辑  收藏  举报