This.LayoutMdi(MdiLayout.TileHorizontal);

}

private void мозаикаВертикальноToolStripMenuItem_Click(object sender, EventArgs e)

{ // вертикальная мозаика

This.LayoutMdi(MdiLayout.TileVertical);

}

private void закрытьТекущееToolStripMenuItem_Click(object sender, EventArgs e)

{ // закрытие текущего (активного) окна с проверкой, существует ли такое

if (this.ActiveMdiChild != null) ActiveMdiChild.Close();

}

private void закрытьВсеToolStripMenuItem_Click(object sender, EventArgs e)

{ // два варианта закрытия всех подчиненных окон

/* for (int i = MdiChildren.Length - 1; i >= 0; i--)

MdiChildren[i].Close();*/

while (this.ActiveMdiChild != null) ActiveMdiChild.Close();

}

ActiveMdiChild – системная переменная, указатель на активное в данный момент окно.

MdiChildren – массив указателей на подчиненные окна.

Может возникнуть необходимость создания подчиненного окна в единственном экземпляре. Для этого необходимо после его создания заблокировать пункт меню его открытия и разблокировать его при закрытии окна. Для этого используем пункт меню Окна – Единственная форма. Этому пункту меню дадим имя FormA и он должен иметь атрибут доступа public. Создаем таким образом почти пустую форму Form4. в число ее переменных включим сссылку на главное окно: public Form1 f1;

Создание и открытие этого окна:

private void FormA_Click(object sender, EventArgs e)

{

Form4 f4;

f4 = new Form4();

f4.MdiParent = this;

FormA.Enabled = false;//закроем пункт меню

f4.f1 = this;// передаем адрес главного окна в Form4

F4.Show();

}

При закрытии пункт меню Единственная форма ( его имя FormA) должен быть снова освобожден. Тонкость в следующем: форму можно закрыть несколькими способами: нажатием на командную кнопку, нажатием на кнопку ´, через системное меню и т.д. В любом случае пункт меню должен быть разблокирован. Для этого используем событие, связанное с закрываемым окном:

FormClosed (происходит после закрытия) или FormClosing (происходит до закрытия). В нашем случае можно использовать любое из них. Найдем нужное событие в списке, делаем на его имени двойной щелчок и пишем реализацию:

private void Form4_FormClosed(object sender, FormClosedEventArgs e)

{

f1.FormA.Enabled = true;

}

В MDI-приложениях возможно изменение меню в главном окне при открытии того или иного подчиненного окна. Для этого создаем меню в подчиненном окне. При открытии этого окна оно соединяется с меню главного окна.

Контрольные вопросы

1. Какие диалоговые средства для управления работой программой Вы знаете?

2. Какие способы представления массивов на формах Вы знаете? Какие их преимущества и недостатки?

3. Проанализируйте отличия MDI- и SDI-приложений.

Объектно-ориентированное программирование в Microsoft Visual Studio 2005

В предыдущих главах мы рассмотрели, как писать программы на C# (по процедурной и по объектно-ориентированной методике), а также создание интерфейса средствами Microsoft Visual Studio 2005. Рассмотрим в этой главе, как объединить в одно целое все изложенное выше: как построить программы для решения прикладных задач и как построить интерфейс для них. Имеются следующие возможности, которые мы по очереди рассмотрим:

1. Дополнить классы форм собственными данными и функциями для решения прикладных задач. Другими словами, объединить в классах интерфейс и логику прикладной задачи.

2. Создать отдельные классы для решения прикладных задач, предусмотрев в их методах (в том числе и в конструкторах) формальные параметры и возвращаемые значения для взаимодействия с интерфейсом. Чтение (запись) данных из интерфейса (в интерфейс) и их передача в методы обеспечивается средствами Visual Studio.

3. Передать в классы прикладных задач указатели на формы (или на компоненты на форме); чтение (запись) данных из форм осуществляется методами классов.

4. В методах классов прикладной задачи предусмотреть открытие форм для ввода/вывода.

Наши рекомендации