VB 22. Разработка приложения с многодокументным интерфейсом (MDI-приложения)

* Задание: Преобразовать приложение из занятия № 16 «Обработка событий мыши» в приложение с многодокументным интерфейсом.

Выполнение:

Многодокументный интерфейс Windows (MDI) позволяет программам работать с множеством форм, расположенных в одной родительской форме. Применение MDI сделает интерфейс программы более аккуратным, поскольку находящиеся в нем формы не будут разбросаны по всему экрану.

Стандарт MDI позволяет совершенствовать программы в двух направлениях. Во-первых, Вы сможете ограничиться одной формой-контейнером, которая станет рабочим фоном приложения. Если пользователь переместит контейнер, вместе с ним переместятся и все дочерние формы, что сделает интерфейс программы организованным и самодостаточным. Во-вторых, что еще важнее, пользователь может одновременно работать с несколькими документами. MDI-приложения позволяют использовать несколько экземпляров одной и той же формы, что увеличивает производительность и гибкость ваших программ.

  1. Рассмотрим на примере, как работает MDI-интерфейс, усовершенствовав наш графический редактор.
  2. Загрузите в окно редактора проект приложения из занятия № 16 «Обработка событий мыши». Основной форме проекта дайте имя frmPicture. Она в дальнейшем будет выступать в роли макета дочерней формы.
  3. Добавьте в проект родительскую MDI-форму с помощью команды меню Project → Add Windows Form → MDI Parent Form (Проект → Добавить форму Windows → Родительская форма MDI). На панели свойств задайте ей имя mdiGeneral. Установите значение свойства Text родительской формы равным Графический редактор Художник 1.0.
  4. Теперь настроим дочернюю форму frmPicture. Установите значение свойства Text для нее равным Рисунок.

Каждое загруженное дочернее окно занимает некоторый объем оперативной памяти. Поэтому, если предполагается интенсивно использовать в программе несколько экземпляров дочерних окон, необходимо свести в них к минимуму объем программного кода и количество элементов управления. В противном случае, приложение может резко замедлить работу компьютера из-за нехватки оперативной памяти.

Родительская MDI-форма является контейнером, в котором располагаются все дочерние окна. Поэтому именно она ответственна за создание дочерних окон. Кроме того, в родительской форме обычно хранятся совместно используемые элементы интерфейса, например, такие как панель инструментов, строка состояния и т.д.

  1. Обратите внимание, что родительская форма имеет собственное меню. Перейдите на меню родительской формы и измените процедуру для пункта меню File → New (Файл → Создать), добавив вместо кода Windows.Forms.Form нашу форму frmPicture:
Private Sub ShowNewForm(ByVal sender As Object, ByVal e As EventArgs) Handles NewToolStripMenuItem.Click,NewToolStripButton.Click, NewWindowToolStripMenuItem.Click
' Создать новый экземпляр дочерней формы.
Dim ChildForm As New frmPicture
' Сделать ее дочерней для данной формы MDI перед отображением.
ChildForm.MdiParent = Me
m_ChildFormNumber += 1
ChildForm.Text = "Рисунок " & m_ChildFormNumber
ChildForm.Show()
End Sub

Давайте разберемся в приведенном листинге. Вначале, в операторе объявления Dim указано имя объектной переменной (переменной типа Object), в которой будет содержаться экземпляр формы; в объявлении Dim используется ключевое слово New. Затем формируется строка заголовка создаваемой формы (свойство .Text). После того, как создана объектная переменная для вывода формы на экран, используется метод Show() для отображения формы. Однако вместо имени формы ему задается имя объектной переменной.

  1. Установите в качестве формы для запуска родительскую MDI-форму (меню Проект → Свойства: WindowsApplication…) и запустите проект. При выборе меню File → New (Файл → Создать) запускается дочерняя форма, но меню на форме не активно.
  2. Перейдите на форму frmPicture и перенесите полностью меню с дочерней формы на родительскую форму (вырезав элемент меню из дизайна дочерней формы и вставив на родительскую). Точно также вырежьте из кода программы тот фрагмент кода дочерней формы, который относится к пунктам меню, и вставьте его в код родительской формы. В результате на дочерней форме не должно остаться ни одного элемента управления.
  3. Добавьте в проект стандартный модуль и из кода дочерней формы вставьте туда описание переменных, изменив Private на Public:
Public КнопкаНажата As Boolean
Public ИнструментКвадрат As Boolean
Public ИнструментЛиния As Boolean
  1. Запустите проект . Сначала выберие меню File → New (Файл → Создать), а затем Инструмент. Нарисуйте что-нибудь на форме. А затем еще раз выберите меню File → New (Файл → Создать) – появился новый экземпляр формы!
  2. Скорее всего, Вы обратили внимание на два неудобства. Первое: при запуске новой формы никакой инструмент не активен. Добавьте в обработку процедуры пункта меню New (Создать) (ShowNewForm) следующий фрагмент:
ИнструментКвадрат = True
  1. Кроме того, если Вы хотите, чтобы при запуске программы появлялось окно для нового рисунка, то добавьте в модуль родительской формы следующий код:
Private Sub MDIGeneral_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ShowNewForm(sender, e)
End Sub
  1. Сразу же можете поменять меню с англоязычного на русский язык, изменив подписи меню в дизайне формы.
  2. Добавим код в обработку события меню Open (Открыть). Открывать будем файл-изображение (расширение bmp), загружая его в качестве фона активной дочерней формы:
Private Sub OpenFile(ByVal sender As Object, ByVal e As EventArgs) Handles OpenToolStripMenuItem.Click, OpenToolStripButton.Click
Dim OpenFileDialog As New OpenFileDialog
 
OpenFileDialog.InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments
OpenFileDialog.Filter = "Text Files (*.bmp)|*.bmp|All Files (*.*)|*.*"
If (OpenFileDialog.ShowDialog(Me) = System.Windows.Forms.DialogResult.OK) Then
  Dim FileName As String = OpenFileDialog.FileName
  ' TODO: Add code here to open the file.
  Dim ChildForm As New frmPicture
  Me.ActiveMdiChild.BackgroundImage = Image.FromFile(FileName)
End If
End Sub
  1. Посмотрите на то, как ведут себя остальные пункты. Можете их удалить или попробовать адаптировать под программу.
  2. Сохраните проект и запустите программу. Создайте пару новых дочерних окон и посмотрите, как ведут себя дочерние формы внутри родительской. Чтобы лучше понять особенности их поведения выполните следующие действия:
  • Минимизируйте дочернюю форму и обратите внимание на расположение ее пиктограммы.
  • Переместите дочернюю форму. Она не выйдет за границы окна родительской формы.
  • Максимизируйте дочернюю форму.
  • Минимизируйте и максимизируйте родительскую форму.

Наконец, немного полезной информации. При работе с MDI-приложениями широко используются два особенных ключевых слова – Me и ActiveMdiChild. Ключевое слово Ме используется в любой форме для ссылки на нее саму. В свойстве родительской формы ActiveMdiChild находится указатель на активную в текущий момент дочернюю форму.

Дополнительное задание:
Самостоятельно усовершенствуйте панель меню, добавив все возможные необходимые пункты.
Вопросы для самоконтроля:

  1. Для чего предназначен MDI-интерфейс? В чем его преимущество перед обычным интерфейсом?
  2. Что представляет собой MDI-форма?
  3. Что представляет собой дочерняя форма?
  4. Для чего используется ключевое слово Me?

* При использовании материалов обязательна ссылка на источник: Майер С.Ф., «MS Visual Basic 2008» — Учебно-методическое пособие : Южный федеральный университет. – Ростов-на-Дону, 2017. – 92 с.