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屬性,本人試了,還是不行。如果朋友們有好的辦法,請貼上代碼,謝謝。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM