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属性,本人试了,还是不行。如果朋友们有好的办法,请贴上代码,谢谢。

 

posted @ 2015-06-26 15:11  壹兒壹  阅读(2578)  评论(2编辑  收藏  举报