11.5. Многодокументный интерфейс

Для поддержки многодокументного интерфейса у форм есть ряд специализиро-ванных свойств, которые упрощают работу с несколькими документами. Давайте рассмотрим это на примере.

Создайте новое приложение и переименуйте главную форму в 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(). Его нужно вызывать у контейнера, т. е. у нашей главной формы. В качестве параметра метод может получать одно из следующих значений:

  • MdiLayout.Cascade — каскадом;
  • MdiLayout.TileHorizontal — выровнять горизонтально;
  • MdiLayout.TileVertical — выровнять вертикально;
  • MdiLayout.ArrangeIcons — выровнять значки.

Последнее значение очень часто путают со сворачиванием окон. Однако оно не сворачивает дочерние окна, а выравнивает значки уже свернутых окон.

Вам может пригодиться также определение активного в данный момент окна. Мы не сохраняем нигде переменные, связанные с дочерними формами, но мы мо-жем с ними работать. Например, следующая строка изменяет заголовок активной сейчас формы на "Активное окно":

   ActiveMdiChild.Text = "Активное окно";

Свойство формы ActiveMdiChild имеет тип Form и указывает на активную сейчас (находящуюся поверх остальных) дочернюю форму.

Список всех дочерних форм находится в свойстве MdiChildren. Это свойство представляет собой массив, каждый элемент которого является объектом класса Form. Вот поэтому я не сохраняю нигде переменные форм после создания, потому что у нас и так есть массив MdiChildren, в который все сохраняется автоматически.

Следующий код перебирает все дочерние окна и изменяет их заголовки:

   int index = 1;
   foreach (Form f in MdiChildren)
   {
     f.Text = "Дочернее окно " + (index++).ToString();
   }

Обратите внимание, как интересно я увеличиваю переменную index. Это дела-ется прямо в коде получения строки. Так как операция ++ стоит после переменной, то сначала будет получена строка текущего значения переменной index, и только потом она будет увеличена.

Этой информации по многодокументному интерфейсу вам будет достаточно. Я все же надеюсь, что вам не придется использовать программы с этим интерфейсом, потому что это не рекомендуется компанией Microsoft. Формы с одним документом интуитивно проще в использовании и лучше воспринимаются пользователями.

Предыдущая глава

11.4. Немодальные окна

Следующая глава

глава 13. Графика

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне