1. 程式人生 > >VB.NET普通窗體使用巢狀作用

VB.NET普通窗體使用巢狀作用

.NET框架元件太大了,比任何以前所寫的封裝功能的庫都要大。這樣有好處,因為它大幅削減了建立應用程式所需編寫的程式碼,但是也使我們不可能完全瞭解該框架元件。但是我們很容易從中找到一些技巧。

  窗體巢狀

  經驗豐富的Visual Basic開發者知道多文件介面(MDI)應用程式能夠包含子窗體,那些子窗體由MDI父窗體管理。但是如果沒有MDI的能力你怎樣實現包含巢狀窗體?例如一個MDI子窗體也可能需要包含另一個窗體。

  有時能夠使用使用者控制元件(UserControl)實現這種功能,但是如果你真的需要把一個窗體巢狀進另一個窗體,有多種方法可以實現。窗體衍生自Control類,這意味著它能被放入另一個窗體的控制元件集合中,使用如下的邏輯:

Dim f As New frmEmbed2()
Me.Controls.Add(f)
f.Show()

但是很不幸,這段程式碼將會導致一個執行時(runtime)異常

試圖把一個窗體新增到另一個窗體的控制元件集合時出現的執行時錯誤

  為了避免這種異常,該窗體的TopLevel屬性必須設定為False(見下面的程式碼)。

    Dim f As New frmEmbed2()

    f.TopLevel = False

    Me.Controls.Add(f)

    f.Show()

圖2顯示的是使用上面的邏輯實現的一個窗體嵌入另一個窗體。嵌入的窗體有一個標題條(它的顏色是未啟用

系統顏色),因此該嵌入窗體能在容器窗體內四處拖動。在圖2中,該窗體從它的開始位置(左上角)拖到了右下角。

圖2.在容器窗體中有一個嵌入的窗體。嵌入的窗體能在容器窗體中拖動。

  通常在顯示嵌入的窗體前先設定它的位置。這隻需要簡單的設定嵌入窗體的Left和Top屬性。嵌入窗體的位置與容器窗體是相對的。

  與MDI子窗體不同,嵌入窗體能覆蓋容器窗體上的控制元件。圖3顯示了它們的不同。

圖3.嵌入窗體(左)可以覆蓋容器窗體上的控制元件。MDI子窗體(右)不能覆蓋MDI父窗體上的控制元件。

  在右邊的MDI例子中,沒有辦法使按鈕隱藏在子窗體的後面。但是在左邊該按鈕被嵌入窗體覆蓋了。

  當窗體第一次被嵌入時,它將顯示在容器窗體上的已存在的控制元件的後面。當它被點選時,它走向前臺並停留在那兒。這會打擾使用者,但是能通過插入下面的程式碼防止這種情況發生:

  f.BringToFront()

  嵌入的窗體可以包含其它的嵌入窗體,沒有實際的限制。圖4顯示了一個本身包含嵌入的窗體的嵌入窗體。