Другая разновидность форм — многодокументные, или MDI-формы. Интерфейс MDI позволяет открыть сразу несколько окон внутри родительского окна-контейнера. Скажем, в главном окне типичного текстового редактора (классический пример — Word for Windows) можно открыть несколько документов (рис. 2.7). Главное окно выполняет функции контейнера, а дочерние формы находятся внутри него. MDI-приложения появились в те времена, когда на рынке преобладали ранние версии Windows. Многодокументные приложения позволяли одновременно открывать несколько файлов, не запуская нескольких копий одной программы. Это экономило не только время, но и память.
Рис. 2.7. Несколько документов в родительском окне-контейнере
Интерфейс MDI обычно используется для документно-ориентированных приложений (например, текстовых или графических редакторов). Программа называется документно-ориентированной, если она предназначена для работы с документами. Если пользователи приложения должны одновременно работать с несколькими формами, выбирайте модель MDI. Visual Basic позволяет очень просто создавать MDI-приложения.
Создание MDI-приложения
Для создания MDI-приложения необходимо иметь как минимум две формы — родительскую (контейнер) и дочернюю (внутреннюю). Чтобы работать с дочерними формами различных типов, необходимо включить в проект дополнительные формы. Тем не менее для простейшего MDI-проекта одной формы вполне достаточно. Проект создается так:
1. Создайте новый проект командой File >• New Project. Если у вас включен Project Wizard, выберите тип проекта Standard EXE.
2. В созданном проекте изначально присутствует одна форма. Задайте ее свойству Name значение frmChild, а свойству Caption — Дочерняя форма MDI.
3. Чтобы создать родительскую форму MDI, щелкните правой кнопкой мыши на папке Forms в окне проекта и выполните команду Add > MDI Form. Когда на экране появится окно Form Wizard, выберите в нем MDI Form.
4. Задайте свойству Name значение frmMDI, а свойству Caption — значение Родительская форма MDI
5. Щелкните правой кнопкой мыши на строке Project1 в окне проекта и выберите из контекстного меню команду Project1 Properties. Выберите из списка Startup Object строку frmMDI. Если не сделать этого, в начале работы вашего приложения будет отображаться дочерняя форма.
6. Выберите в окне проекта строку frmChild. Задайте свойству MDI Child значение True - теперь дочерняя форма будет находиться внутри родительской.
7. Выберите в окне проекта строку frmMDI.
8. Запустите редактор меню командой Tools > Menu Editor. Появляется окно, изображенное на рис. 2.8.
Рис. 2.8. Редактор меню
В своем примере мы ограничимся очень простым меню. Не беспокойтесь о технических подробностях работы с редактором меню - они будут рассмотрены в уроке 5, «Создание и использование меню и панелей инструментов».
1. Введите &File в поле Caption.
2. Введите mnuFile в поле Name.
3. Нажмите кнопку Next.
4. Нажмите кнопку со стрелкой вправо — у команды меню появляется отступ.
5. Введите &New Form в поле Name.
6. Введите mnuFileNew в поле Name.
7. Закройте редактор меню кнопкой ОК.
8. В форме frmMDI должно появиться меню File. Выполните команду File > New, и на экране появится окно программы.
9. Вставьте в процедуру события mnuFileNew_Click() следующий фрагмент:
Dim frm As New frmChild
frm.Show
10. Сохраните и запустите проект. На рисунке показан примерный вид окна MDI-ириложения.
Добавленный нами фрагмент создает новую копию формы frmChild и отображает ее. Это происходит при каждом выполнении команды File > New. Попробуйте открыть и закрыть несколько дочерних окон; как видите, мы построили вполне рабочее MDI-приложение.
Новая версия MDI-приложения
Чтобы наша программа действительно была похожа на коммерческие MDI-приложения Windows, необходимо добавить несколько дополнительных штрихов. Например, все дочерние формы имеют одинаковые названия, так что их невоз-
можно отличить друг от друга; этот недостаток нужно исправить. Также хотелось бы иметь возможность упорядочить дочерние окна и выстроить их «мозаикой», или «каскадом». Наконец, в меню должен присутствовать список окон, при помощи которого можно легко перейти к любому дочернему окну, даже если оно спрятано под другими окнами.
1. Запустите редактор меню и добавьте в строку меню родительского окна, frmMDI, новое меню &Window. Установите флажок WindowList в редакторе меню.
2 Добавьте в новое меню команды Tile и Cascade. Назовите их mnuWindowTile и mnuWindowCascade соответственно.
3. Закройте редактор меню кнопкой ОК.
4. Добавьте в процедуру события Click объекта mnuWindowTile следующую строку:
frmMDI.Arrange vbTileHorizontal
5. Добавьте в процедуру события Click объекта mnuWindowCascade следующую строку:
frmMDI.Arrange vbCascade
vbCascade и vbTileHorizontal — встроенные константы Visual Basic. Их значение описано в справочной системе.
6. Измените код процедуры для команды mnuFileNew:
Private Sub mnuFileNew_Click()
Static Counter As Integer
Dim frm As New frmChild
Counter = Counter + 1
frm.Caption = "Дочерняя форма MDI" & Counter
frm.Show
End Sub
7. Сохраните и запустите приложение. Обратите внимание на отличия рис. 2.9 от предыдущего рисунка.