Приложение с дочерними окнами

В начало книги

logo.gif

Глава 8. Приложение с дочерними окнами


В начало

Параграф 1. Создание приложения с дочерними окнами

Создание приложения с дочерними окнами в Visual Studio предельно просто. При создании Windows приложения достаточно установить свойство IsMdiContainer в значение true и проект решения становится проектом решения с дочерними окнами, приобретая соответствующий вид и свойства (Рис.1.).

Следующим этапом разработки приложения с дочерними окнами становится создание непосредственно формы для дочерних окон. Для этого к проекту добавляем новую форму Рис.1. (например, с именем MDIChildForm).

winapp008.gif

Рис.1. Решение приложения с дочерними окнами

И, последним этапом, осталось добавить пункт меню (createChild) для создания новой формы и его обработчик (двойной клик мышкой на пункте меню) и пункт меню Close All Childern. И не забудем закрыть все, что открыто, в обработчике события пункта меню Close All Childern.

private void createChildToolStripMenuItem(object sender, EventArgs e)
{
 vNewChildForm(null);
}
private void vNewChildForm(string sS)
{
 int viI=0;
 MDIChildForm child = new MDIChildForm();
 child.MdiParent = this;            
 //Иконка как и у родителя, можно загрузить любую другую из файла
 child.Icon = this.Icon;
 foreach (MDIChildForm mdicf in this.MdiChildren)
 {
  viI++;
  //Если хотим, что бы номера открытых форм шли более 
  //менее по порядку - включаем в проект оператор If
  if (mdicf.Text != "Untitled: " + Convert.ToString(viI))
  {
    break;
  }
 }
 child.Text = "Untitled: " + Convert.ToString(viI);
 child.Show();
 //Следующий прием позволяет сразу отобразить иконку 
 //дочернего окна не ожидая перерисовки формы при 
 //FormWindowState = Maximized 
 child.WindowState = FormWindowState.Normal;
 child.WindowState = FormWindowState.Maximized;
 child = null;   
 //Можно задать расположение окон - расположить по горизонтали
 //LayoutMdi(MdiLayout.TileHorizontal);
 //По вертикали
 //LayoutMdi(MdiLayout.TileVertical);
 // Расположение каскадом
 LayoutMdi(MdiLayout.Cascade); 
}
private void closeAllChildernToolStripMenuItem_Click(object sender, EventArgs e)
{
 foreach (Form child in MdiChildren)
 {
  child.Close();
 }
 //Можно программно выйти из режима Mdi Container
 //this.IsMdiContainer = false;
}

Можно создать дополнительно ("страховочное") закрытие всех открытых дочерних окон, например, в обработчике события закрытия основной формы:

 
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
 foreach (Form child in MdiChildren)
 {
  child.Close();
 }
}

Результат выполнения решения показан на Рис.2.

winapp009.gif

Рис.2. Приложение с дочерними окнами


В начало

Параграф 2. Взаимодействие между родительской и дочерними формами

Дочерние окна обычно используются как самостоятельные окна со своими функциональными возможностями. Уже хорошо то, что основное окно может управлять их открытием и закрытием. Хотя, это не мешает организовать и "более тесное взаимодействие" между ними. Организовать взаимодействие между окнами можно множествами способов. Один из них показан ниже.

Добавим в форму основного окна пункт меню "Set Phrase to Childern", как показано на Рис.3.

winapp017.gif

Рис.3. Решение приложения с дочерними окнами

Создадим обработчик события выбора данного пункта меню, в котором предполагается, что в дочерних окнах будет иметься функция vSetPhrase для приема сообщения:

private void setPhraseToChildernToolStripMenuItem_Click(object sender, EventArgs e)
{
 foreach (MDIChildForm child in MdiChildren)
 {
  child.vSetPhrase("Всем детям - C праздником 9 мая! Всем ветеранам - Ура!");
 }
}

И создадим функцию для приема сообщения от дочерних окон:

public void vSetText(string s)
{           
 MessageBox.Show("Мне прислали сообщение: " + s);
}

Теперь, на дочернюю форму, поместим контролы Button и Label, с соответствующим текстом, как показано на Рис.4.

winapp018.gif

Рис.4. Форма для дочернего окна

В коде для дочерней формы или полностью заменим конструктор, или добавим еще один, который позволяет принимать ссылку на основную форму:

private Form1 fmParent = null;
//Конструктор по умолчанию 
public MDIChildForm()
{
 InitializeComponent();
}
//Добавляем конструктор, принимающий ссылку на родительскую форму
public MDIChildForm(Form1 fmParent) 
{
 this.fmParent = fmParent;
 InitializeComponent();
}

Соответственно в основной форме в функции создания дочернего окна необходимо заменить

MDIChildForm child = new MDIChildForm();

на:

//В конструктор дочерней формы передаем ссылку на родителя
MDIChildForm child = new MDIChildForm(this);

Осталось дописать функцию приема данных от основной формы, и отсылки сообщений из дочерней формы в основную, например:

public void vSetPhrase(string s)
{
 label1.Text = s;
}
private void MDIChildForm_FormClosed(object sender, FormClosedEventArgs e)
{
 fmParent.vSetText("Я, Ваша дочка \"" + Text + "\" закрылась!");
}

В принципе, этого достаточно для показа взаимодействия форм. Но можно еще добавить определение параметров основной формы в дочерних окнах, как это сделано в обработчике события нажатия кнопки:

private void button1_Click(object sender, EventArgs e)
{
 string s = ParentForm.Name;
 MessageBox.Show("Мой радитель " + s + ".");
 //Или так
 MessageBox.Show("Мой радитель " + fmParent.Name);
}

Результат выполнения решения показан на Рис.5.

winapp019.gif

Рис.5. Выполнение приложения

Решение на данном этапе можно скачать по этой ссылке ~ 48 кб.

Молчанов Владислав 12.09.2007г., переработано 8.5.2009г.

Еcли Вы пришли с поискового сервера - посетите мою главную страничку

На главной странице Ва узнаете, как я могу помочь Вам в написании офисной программы любой сложности в соответствии с Вашими запросами. И найдете ряд програм или ссылок на образцы.

Кроме того - на главной странице Вы найдете бесплатные программы: программы комплекса Veles - программы для автолюбителей, программы из раздела графика - программы для работы с фото, сделанными цифровым фотоаппаратом, программу Bricks - игрушку для детей и взрослых, программу записную книжку, программу TellMe - говорящий Русско-Английский разговорник - программу для тех, кто собирается погостить за бугром или повысить свои знания в английском, теоретический материал по программированию в среде Borland C++ Builder, C# (Windows приложения и ASP.Net Web сайты).

logo.gif

В начало страницы и главы

В начало книги

На главную страницу


Сайт управляется системой uCoz