Для поддержки многодокументного интерфейса у форм есть ряд специализиро-ванных свойств, которые упрощают работу с несколькими документами. Давайте рассмотрим это на примере.
Создайте новое приложение и переименуйте главную форму в MDIMainForm, что-бы не работать с именами по умолчанию. Чтобы эта форма могла работать контей-нером и содержать дочерние окна, нужно изменить ее свойство IsMDIContainer на true.
Теперь создайте в проекте еще одну форму, точно так же, как мы создавали диалоговые окна. Назовите эту форму DocumentForm. Ничего больше менять не нуж-но.
Вернитесь к главному окну, где и будет продолжаться программирование. Что-бы приложение выглядело хоть немного прилично, поместите на форму компонент MenuStrip — пусть у формы будет меню. Создайте меню Файл и в нем пункт меню Создать. Добавьте обработчик события Click для пункта меню Создать и в нем напишите следующий код:
private void renameToolStripMenuItem_Click(object sender, EventArgs e) { DocumentForm child = new DocumentForm(); child.MdiParent = this; child.Text = "Документ - " + MdiChildren.Length; child.Show(); }
Создание дочернего MDI-окна схоже с созданием немодального окна, только после инициализации вам необходимо изменить свойство MdiParent, куда нужно сохранить объект формы, которая будет являться MDI-контейнером. Если свойство MdiParent у формы не равно нулю, то форма автоматически становится дочерней для указанного контейнера, т. е. начинает отображаться внутри него. Так как код выполняется в форме MDIMainForm, то для получения текущего объекта можно ис-пользовать ключевое слово this.
В третьей строке кода я для красоты задаю заголовок дочернего окна. Заголовок будет состоять из текста и номера окна. Чтобы получить номер окна, я использую MdiChildren.Length. Свойство формы MdiChildren — это коллекция, в которой хра-нятся все дочерние окна текущего контейнера.
Последняя строка кода вызывает метод Show(), чтобы отобразить окно немо-дально. Попытка отобразить модально окно, содержащее родительское окно (окно с заполненным свойством MdiParent), приведет к генерации исключительной ситу-ации.
Если у формы указана родительская форма, являющаяся MDI-контейнером, то такая форма будет отображаться внутри контейнера, как показано на рис. 11.5.
Рис. 11.5. Многодокументная форма с дочерними формами
В многодокументных приложениях очень часто присутствует меню, из которо-го можно вызвать команды выравнивания окон. Это легко сделать с помощью ме-тода LayoutMdi(). Его нужно вызывать у контейнера, т. е. у нашей главной формы. В качестве параметра метод может получать одно из следующих значений:
Последнее значение очень часто путают со сворачиванием окон. Однако оно не сворачивает дочерние окна, а выравнивает значки уже свернутых окон.
Вам может пригодиться также определение активного в данный момент окна. Мы не сохраняем нигде переменные, связанные с дочерними формами, но мы мо-жем с ними работать. Например, следующая строка изменяет заголовок активной сейчас формы на "Активное окно":
ActiveMdiChild.Text = "Активное окно";
Свойство формы ActiveMdiChild имеет тип Form и указывает на активную сейчас (находящуюся поверх остальных) дочернюю форму.
Список всех дочерних форм находится в свойстве MdiChildren. Это свойство представляет собой массив, каждый элемент которого является объектом класса Form. Вот поэтому я не сохраняю нигде переменные форм после создания, потому что у нас и так есть массив MdiChildren, в который все сохраняется автоматически.
Следующий код перебирает все дочерние окна и изменяет их заголовки:
int index = 1; foreach (Form f in MdiChildren) { f.Text = "Дочернее окно " + (index++).ToString(); }
Обратите внимание, как интересно я увеличиваю переменную index. Это дела-ется прямо в коде получения строки. Так как операция ++ стоит после переменной, то сначала будет получена строка текущего значения переменной index, и только потом она будет увеличена.
Этой информации по многодокументному интерфейсу вам будет достаточно. Я все же надеюсь, что вам не придется использовать программы с этим интерфейсом, потому что это не рекомендуется компанией Microsoft. Формы с одним документом интуитивно проще в использовании и лучше воспринимаются пользователями.