來自Asp.net精英論壇:bbs.1aspx.com
6.8 建立多文檔的界面
到目前為止你建立的所有項目都是單文檔界面(single document interface,SDI)的項目。在SDI程式中,應用中的每個窗體與其他的窗體都是對等的,窗體之間不存在層次關系。Visual C# 也允許建立多文檔界面(MDI)程式。MDI程式包含一個父視窗(也稱為容器)以及一個或多個子視窗。MDI程式的一個經典例子是Adobe PhotoShop。運作PhotoShop時,顯示一個父視窗。在這個父視窗内,可以打開任意數量的文檔,每個文檔都在一個子視窗中顯示。在MDI程式中,所有子視窗都共享父視窗的同一個工具欄和菜單欄。
子視窗的一個限制是它們隻能在父視窗的邊界之内顯示。圖6.19顯示了運作的PhotoShop,它打開了多個子文檔視窗。
圖6.19 MDI程式由一個父視窗以及一個或多個子視窗組成 |
注意:除了子視窗,MDI應用還可以包含任意數量的正常視窗(如對話框)。 |
下面建立一個簡單的MDI項目。執行以下步驟建立項目。
1.在菜單上選擇“檔案/建立項目”,顯示“建立項目”對話框(注意到這是一個模式視窗)。
2.在“名稱”中輸入“MDI Example”,然後單擊“确定”,建立項目。
3.在“解決方案資料總管”中右擊Form1.cs,在彈出菜單上選擇“重命名”,然後将窗體的名稱修改為fclsMDIParent.cs。接下來,将窗體的Text屬性設定為“MDI Parent”,并将它的IsMdiContainer 屬性設定為True(如果不将IsMdiContainer 屬性設定為True,這個例子将不可行)。
首先,Visual C# 将客戶區域變為暗灰色,并呈現下陷效果。這是MDI父視窗的标準外觀。所有可見的子視窗都在該區域中顯示。
4.在菜單上選擇“項目/增加Windows窗體”,建立一個新的窗體。将該窗體命名為fclsChild1.cs,并将其Text屬性改為Child 1。
5.添加第三個窗體到項目中。将該窗體命名為fclsChild2.cs,并将其Text屬性改為Child 2。
6.單擊工具欄上的“全部儲存”。
7.在“解決方案資料總管”中輕按兩下fclsMDIParent.cs,在設計器中顯示父視窗。
8.接下來,輕按兩下窗體通路其預設事件—Load事件。輸入下列代碼:
clsChild1 objChild = new fclsChild1();
objChild.MdiParent = this;
objChild.Show();
現在,你已經知道第一條語句和最後一條語句的作用了。第一條語句執行個體化一個新的對象,類型為fclsChild1。最後一條語句無模式地顯示該窗體。這裡我們感興趣的是第二條語句。它将窗體的MdiParent屬性設定為目前窗體(this總是引用目前對象),目前窗體是一個MDI父窗體,因為它的IsMdiContainer 屬性設定為True。當顯示這樣的一個新窗體時,它将作為MDI的一個子窗體。
現在按F5鍵運作程式。注意觀察子窗體如何顯示在父窗體的客戶區域。如果調整父窗體的大小使得一個或多個子窗體不能顯示,這時便會出現滾動條(見圖6.20)。如果删除了設定MdiParent屬性的語句,則窗體将隻是浮動在父窗體之上(因為它不再是子窗體),是以不再顯示在父窗體的邊界之内。
在菜單上選擇“調試/停止調試”停止運作項目,并執行下列步驟:
1.顯示“解決方案資料總管”,輕按兩下fclsChild1窗體使它顯示在設計器中。
2.添加一個按鈕到窗體中,并如下設定按鈕的屬性:
屬性 | 值 |
Name | btnShowChild2 |
Location | 105,100 |
Size | 85,23 |
Text | Show Child 2 |
圖6.20 子窗體隻能顯示在父窗體的邊框之内 |
3.輕按兩下按鈕通路它的Click事件,然後添加下列代碼:
fclsChild2 objChild = new fclsChild2();
objChild.MdiParent = this.MdiParent;
objChild.Show();
這段代碼顯示第二個子窗體。注意這段代碼與之前輸入的代碼的差別。不能将第二個子窗體的MdiParent設定為this,因為this引用目前窗體(fclsChild1,它并不是MDI容器)。但是,this.MdiParent引用了目前子窗體的父窗體,這正是最初将窗體設定為子窗體時設定的屬性。是以,可以将第一個子窗體的父窗體傳遞給第二個子窗體,這樣它們就成為同一個窗體的子窗體。
注意:任一窗體都可以作為子窗體(當然,除了MDI父窗體之外)。要使一個窗體成為子窗體,将它的MdiParent屬性設定為一個已定義為MDI容器的窗體。 |
4.按F5鍵運作項目。可以看到子窗體中的按鈕,單擊這個按鈕(如果你看不到這個按鈕,你可能誤将它添加到第二個子窗體中了)。單擊按鈕時,就會顯示第二個子窗體。注意看這個窗體是如何顯示在父窗體的邊界之内的(見圖6.21)。
圖6.21 子窗體之間是平等的 |
提示:MDI父窗體具有ActiveMdiChild屬性,用它可獲得對目前活動子視窗的引用。 |
注意:要使父視窗在項目第一次運作時更大,可在設計或運作時在窗體的Load事件中設定窗體的Size.Height和Size.Width屬性。 |
關于窗體,有一點要記住:可以建立任意多的窗體執行個體。但是,管理同一窗體的多個執行個體很複雜,這超出了本書的範圍。
如果你還不了解MDI窗體,不要擔心。作為Visual C# 新手,你編寫的大多數應用程式都将是SDI程式。當你更熟悉一般的Visual C# 項目的建立時,再開始嘗試MDI項目。記住,不要隻是因為可以建立MDI程式而使用MDI;隻有在項目要求時才使用MDI
6.9 小結
了解窗體很重要,因為窗體是動态的畫布,可以在上面建構使用者界面。如果不知道如何使用窗體,整個應用程式就會受損。使用窗體不僅是設定屬性,特别是當你考慮到終端使用者的時候。随着經驗的增長,你将進入窗體設計的最佳狀态,事情變得很自然。
在這一章中,你學習了如何做一些有趣的事情,如建立透明的窗體,以及一些高端的技巧,如建立MDI應用程式。你還學習了如何建立可滾動的窗體(不可忽略的界面元素),你還花了許多時間在窗體的控件上,這是很重要的,因為窗體的主要功能就是用來放置控件。在接下來的兩章中,你将學習Visual C# 的許多功能強大的控件,這些控件将成為你的開發武器庫中的重要武器。