• MDI窗体及涉及到的相关问题


    MDI窗体是个什么东东尼?多文档窗体唠,相对的还有个SDI,就是单文档窗体。一般情况下我们会将软件的主窗体设置为MDI窗体。那么在主窗体的菜单部分调出来的其他窗体就是主窗体的子窗体了。

    (1)在主窗体中如何调用一个子窗体尼?贴代码啦,这段代码当然是写在主窗体里面的按钮或者菜单事件里面,很简单唠

       private void 比赛科目ToolStripMenuItem_Click(object sender, EventArgs e)
            {
                Form childForm = new Form();
                childForm.MdiParent = this;
                childForm.Text = "窗口 " ;
                childForm.WindowState = FormWindowState.Maximized;//子窗体在父窗体中最大化
                childForm.Show();
            }

    (2)子窗体的排序,如果我们系统新建一个MDI父窗体,其实里面有代码示例的,不过还是贴出来吧,子窗体的排列有层叠、水平平铺、垂直平铺等等

            private void CascadeToolStripMenuItem_Click(object sender, EventArgs e)
            {
                LayoutMdi(MdiLayout.Cascade);//层叠
            }
    
            private void TileVerticalToolStripMenuItem_Click(object sender, EventArgs e)
            {
                LayoutMdi(MdiLayout.TileVertical);//垂直平铺
            }
    
            private void TileHorizontalToolStripMenuItem_Click(object sender, EventArgs e)
            {
                LayoutMdi(MdiLayout.TileHorizontal);//水平平铺
            }
            //关闭所有子窗体
            private void CloseAllToolStripMenuItem_Click(object sender, EventArgs e)
            {
                foreach (Form childForm in MdiChildren)
                {
                    childForm.Close();
                }
            }

    (3)还涉及到一个问题,就是同一个子窗体不能重复打开吧,嗯,这需要解决一下,代码上

           /// <summary>
            /// 检查打开的MDI窗口,是否有打开,如有打开,激活即可,不做重复打开
            /// </summary>
            /// <param name="Frmname"></param>
            private bool CheckFrm(Form cForm)
            {
                foreach (Form sonfrm in this.MdiChildren)
                {
                    if (sonfrm.Name == cForm.Name)
                    {                   
                        return false;
                    }
                }
                return true;
            }
    
            private void ShowNewForm(object sender, EventArgs e)
            {
                Form childForm = new Form();           
                childForm.Text = "窗口 ";
                childForm.Name = "StudentForm";
                if (CheckFrm(childForm))
                {
                    childForm.MdiParent = this;
                    childForm.Show();
                    childForm.Activate();
                }
                else
                {              
                    childForm.Activate();
                    childForm.WindowState = FormWindowState.Normal;
    
                }
               
            }
           // 对于非MDI窗体同样可以使用如下方法检测
            private bool CheckOpen(Form cForm)
    
            {
                 foreach (Form frm in Application.OpenForms) //遍历已打开窗口
                {
                    if (frm.Name == cForm.Name)                         //如果此窗口已打开
                     {
                          frm.Activate() ;          //激活当前窗体
                          if(frm.WindowState==FormWindowState.Minimized)     //如果当前窗体已经最小化
                          {
                            frm.WindowState=FormWindowState.Normal;              //还原窗体
                          }  
                       return true;
                     }
                 }
               return false;
    
            }

    本人采用的方法,感觉还不错

    在MDI父窗口中放一个splitContainer1进去,将MDI子窗体的父组件设置成splitContainer1的一个panel,这种适合左侧有快捷菜单的。先上个图

    这样可以将子窗体放到pannel2里面了。上代码

    /// <summary>
            /// 菜单运动员信息
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void 运动员信息ToolStripMenuItem_Click(object sender, EventArgs e)
            {
                ShowMemberInfoFrm();
            }
    
            /// <summary>
            /// 展示运动员信息管理窗口
            /// </summary>
            private void ShowMemberInfoFrm()
            {
                this.splitContainer1.Panel2.Controls.Clear();//这个地方直接把当前显示的子窗体干掉,然后显示新窗体
                MemberInfoFrm frm = new MemberInfoFrm();
                frm.MdiParent = this;
                frm.Parent = splitContainer1.Panel2;
                frm.Show();
                frm.Dock = DockStyle.Fill;//这个很有用,就是子窗体全部充满整个右侧的pannel,并随着pannel的大小跟随变化
            }
    这里有一个问题,不管是MDI窗体还是本人采用的pannel,都可以采用窗体重复打开检测,即(3)中的方法进行检查,然后激活即可。但是试验证明激活不了,覆盖掉的窗体不会显示到最前面来,有朋友说用TopMost或TopLevel属性,本人试了,还是不行。如果朋友们有好的办法,请贴上代码,谢谢。
  • 相关阅读:
    二叉查找中使用位运算符
    Python2021专业版激活码
    南邮计算机方向
    7.字符串、异常处理、文件和流(C++学习笔记)
    6.多态与抽象(C++学习笔记)
    5.对象类与继承(C++学习笔记)
    4.数组与指针(C++学习笔记)
    3.C++函数(C++学习笔记)
    2.C++控制语句(C++学习笔记)
    1.基本知识(C++学习笔记)
  • 原文地址:https://www.cnblogs.com/yieryi/p/4602318.html
Copyright © 2020-2023  润新知