轉自:http://qianshao.blog.51cto.com/935360/201520
u 本節學習目標:
n 理解 MDI和SDI的概念和差別
n 熟練設定MDI表單及一般表單的主要屬性設定
n 掌握並實現對MDI表單的排列技巧
n 掌握並實現多重文件介面的表單傳值技術
1-4-1 簡介
我們在前面所設計的視窗被稱為是單文件視窗(SDI),1-18所示。但很多時候的應用軟體是在多文件視窗環境下進行開發設計的,這種多重文件介面就是所謂的MDI,是從Windows 2.0下的Microsoft Excel試算表程式開始引入的,這是因為Excel試算表使用者有時需要同時操作多份表格,MDI正好為這種操作多表格提供了很大的方便,於是就產生了MDI程式。在視窗系統3.1版本中,MDI得到了更大範圍的應用。其中系統中的程式管理器和檔案管理工具都是MDI程式。
圖1-18 一般的單文檔(SDI)介面
MDI編程主要是在主表單中能夠建立一個MDI表單,並且能夠對主表單中的所有MDI表單實現層疊、水平平鋪和垂直平鋪。雖然這些操作比較基本,但卻是程式設計中的要點和重點。
1-4-2 多重文件介面設定及表單內容1.多重文件介面(MDI)屬性說明
一般產生的表單都屬於單文檔表單(SDI),只有將單文檔表單的IsMdiContainer屬性設定成為True,才可以被設定成為多文檔表單。見圖1-19所示。
圖1-19 由單文檔(SDI)改成為多文檔(MDI)介面
多重文件介面的基本屬性其實也就是表單的屬性,表單主要屬性、方法和事件見下表1-7所示:
屬性
說明
StartPosition
初始視窗位置。一般為了使得表單啟動時候置中對齊,多設定該屬性值為CenterScreen
CancelButton
該屬性可以提供自動搜尋當前表單之中的所有Button對象,通過列表有使用者確認按下esc鍵後執行那個Button按鈕。
ControlBox
確定系統是否有表徵圖和最大最小關閉按鈕。屬性值為true和false,當為false時候則無法看到標題列目表徵圖和最大最小關閉按鈕
FormBorderStyle
指定邊框和標題列的外觀和行為。共有七中效果可供選擇,比如選擇FixedToolWindow的時候,僅存關閉按鈕,沒有最大和最小按鈕。
HelpButton
確定表單的標題列上是否有協助按鈕。
KeyPreview
確定表單鍵盤事件是否已經向表單註冊。
MainMenuStrip
確定鍵盤啟用和多文檔合并。
ShowInTaskbar
確定表單是否出現在工作列中。
WindowState
確定表單的初始可視狀態。共有三種狀態,Normal為正常態,Maximized為初始最大化,Minimized為初始最小化。
方法
說明
Activate
當表單被啟用時候發生
MdiChildActivate
當MDI子表單被啟用時候發生
事件
說明
Activated
每當表單被啟用時候發生
Load
每當使用者載入表單時候發生
表1-7 MessageBox.Show()方法重載
請讀者自行根據屬性提示內容,簡單嘗試表單內容的性質和效果。
2.案例學習:建立多重文件介面(MDI)
本次實驗目標是首先建立一個Form主表單,並在該主表單之中建立菜單,通過菜單開啟其餘的子表單。最終顯示介面1-17所示。
圖1-20 多文檔主介面
u 實驗步驟(1):
由圖1-18所示,首先將當前操作的Form表單內容設定如下:
屬性名稱
屬性參數設定
說明
text
父視窗
表單標籤名稱
StartPosition
CenterScreen
表單置中
FormBorderStyle
FixedToolWindow
無最大最小按鈕
IsMdiContainer
True
設為MDI主視窗
u 實驗步驟(2):
為該MDI表單配置MainMenu菜單,工具箱預設沒有該控制項,開啟工具箱的所有Windows控制項部分,用按右鍵工具箱介面,在開啟的菜單中選擇“選擇項”,並在展開的系統選擇項中尋找MainMenu控制項,添加後即出現在Windows控制項部分。具體操作1-21所示:
圖1-21 為MDI表單添加MainMenu菜單控制項
u 實驗步驟(3):
開啟方案總管,建立一個Windows表單,取名為Form2,該表單並非MDI表單,即無需指定其IsMdiContainer屬性為True。雙擊圖1-20中功能表項目內的子視窗1,進入代碼編輯地區,填寫下面代碼:
小實驗:子視窗1功能表項目按一下滑鼠事件來源代碼:
private void menuItem3_Click(object sender, EventArgs e)
{
Form2 Mdichild = new Form2();//首先執行個體化Form2對象,命名為Mdichild
Mdichild.MdiParent = this;
//其次指定即將開啟的Form2對象的MdiParent,即Form2對象的MDI父視窗,為當前的主MDI視窗。
Mdichild.Show();//顯示Form2對象的MDI父視窗
}
此時,開啟的Form2表單就只能夠在當前表單下活動,而不會出當前表單的範圍。按照此方法,再建立兩個表單,命名為Form3和 Form4,並可以通過子視窗2和子視窗3菜單單擊開啟它們。
3. 案例學習:實現對MDI表單的排列
(1)實現對MDI表單的層疊
對於在主表單中實現對MDI表單的層疊操作,在主程式中是通過一個方法LayoutMdi來實現的,他所帶的參數是MdiLayout.Cascade,在原有的menuItem3_Click事件中添加如下代碼:
小實驗:MDI表單的層疊原始碼:
private void menuItem3_Click(object sender, EventArgs e)
{
…….
this.LayoutMdi(MdiLayout.Cascade);
}
(2)實現對MDI表單的水平平鋪
要在主表單實現MDI表單水平平鋪,也是通過LayoutMdi方法,此時所帶的參數是MdiLayout.TileHorizontal,在原有的menuItem3_Click事件中修改如下代碼:
小實驗:MDI表單的水平平鋪原始碼:
private void menuItem3_Click(object sender, EventArgs e)
{
……
this.LayoutMdi(MdiLayout.TileHorizontal);
}
(3)實現對MDI表單的垂直平鋪
要在主表單實現MDI表單垂直平鋪,也是通過LayoutMdi方法,此時所帶的參數是MdiLayout.TileVertical,在原有的menuItem3_Click事件中修改如下代碼:
小實驗:MDI表單的垂直平鋪原始碼:
private void menuItem3_Click(object sender, EventArgs e)
{ ……
this.LayoutMdi(MdiLayout.TileVertical);
}
以上內容實驗結果如1-22所示:
圖1-22 MDI表單排列子表單的多種方式
本文出自 “熊貓寫程式” 部落格,轉載請與作者聯絡!