Иллюстрированный самоучитель по VB.NET

       

Формы MDI


В прежних версиях VB при программировании приложений с интерфейсом MDI (Multiple Document Interface) родительская форма MDI выбиралась на стадии конструирования. В .NET эта задача решается иначе — свойству IsMdiContainer формы задается значение True. Программист создает дочерние формы MDI на стадии конструирования или выполнения, а затем заносит в их свойство Mdi Parent ссылку на форму со свойством I sMdi Conta i пег, равным True. Таким образом, в программах VB .NET можно сделать то, что было практически нереально в предыдущих версиях VB, — изменять связи MDI во время работы программы. Кроме того, приложение может содержать несколько родительских форм MDI; в VB6 такая возможность не поддерживалась.

Рассмотрим пример. Создайте приложение со следующей процедурой Forml_Load:

Private Sub Forml_Load(ByVal sender As System.Object._

ByVal e As System.EventArgs) Handles MyBase.Load

Me.Text = "I'm an MDI Parent"

Me.IsMdiContainer - True

Dim MyChild As New System.Windows.Forms.Form()

MyChiId.MdiParent = Me

MyChild.Show()

MyChild.Text ="MDI Child" End Sub

Примерный вид окна показан на рис. 8.12.

Конечно, это весьма жалкое подобие приложения MDI. В приложениях MDI обычно присутствует меню Window, позволяющее расположить открытые дочерние окна «черепицей» или «мозаикой», а также активизировать любое дочернее окно. Меню Window реализуется в родительском окне, причем его код может быть достаточно простым:

Public Sub InitializeMenu()

Dim mnuWindow As New MenuItem("&Window")

MainMenu1.MenuIterns.Add(mnuWindow)

mnuWindow.MenuItems.AddCNew Menultem _

("&Cascade", AddressOf WindowCascade_Clicked))

mnuWindow.MenuItems.Add(New Menultem

("Tile &Horizontal", AddressOf WindowTileHoriz_C1icked))

mnuWindow.MenuItems.Add(New Menultem _

("Tile &Vertical". AddressOf WindowTileVert_Clicked))

mnuWindow.MdiList = True

End Sub

Protected Sub WindowCascade_Clicked(ByVal


Sender As Object. ByValeAs System.EventArgs)

Me.LayoutMdi(MdiLayout.Cascade)

End Sub

Protected Sub WindowTileHoriz_Clicked(ByVal Sender As Object._

ByVal e As System.EventArgs)

Me.LayoutMdi(MdiLayout.TileHorizonta1)

End Sub

Protected Sub WindowTileVert_Clicked(ByVal Sender As Object,

ByVal e As System.EventArgs)

Me.LayoutMdi(MdiLayout.TileVertica1)

End Sub

Примерный вид окна, полученного при вызове InitializeMenu для формы из предыдущего примера, показан на рис. 8.13.

Формы MDI


Рис. 8.12. Простейшее приложение MDI

Формы MDI


Рис. 8.13. Типичное меню Window в приложении MDI

Чтобы оповестить родительскую форму об активизации дочернего окна, следует зарегистрировать обработчик для события mdi ChildActivate. Активизируемое окно определяется при помощи свойства ActiveMdiChild класса Form. Например, в следующем фрагменте создается обработчик для вывода в строке состояния (элемент StatusBar) родительской формы содержимого заголовка дочернего окна: AddHandler Me.MdiChi1dActivate.AddressOf Me.MdiChi1dActivated Остается лишь определить следующую процедуру:

Protected Sub MdiChi1dActivated(sender As object, e As System.EventArgs)

If (Me.ActiveMdiChild <> Nothing) Then statusBarl.Text

Me.ActiveMdiChild.Text

End If

End Sub




Содержание раздела