?
|
Глава 8. Приложение с дочерними окнами
Параграф 1. Создание приложения с дочерними окнамиСоздание приложения с дочерними окнами в Visual Studio предельно просто. При создании Windows приложения достаточно установить свойство IsMdiContainer в значение true и проект решения становится проектом решения с дочерними окнами, приобретая соответствующий вид и свойства (Рис.1.). Следующим этапом разработки приложения с дочерними окнами становится создание непосредственно формы для дочерних окон. Для этого к проекту добавляем новую форму Рис.1. (например, с именем MDIChildForm).
Рис.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.
Рис.2. Приложение с дочерними окнами Параграф 2. Взаимодействие между родительской и дочерними формамиДочерние окна обычно используются как самостоятельные окна со своими функциональными возможностями. Уже хорошо то, что основное окно может управлять их открытием и закрытием. Хотя, это не мешает организовать и "более тесное взаимодействие" между ними. Организовать взаимодействие между окнами можно множествами способов. Один из них показан ниже. Добавим в форму основного окна пункт меню "Set Phrase to Childern", как показано на Рис.3.
Рис.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.
Рис.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.
Рис.5. Выполнение приложения Решение на данном этапе можно скачать по этой ссылке ~ 48 кб. Молчанов Владислав 12.09.2007г., переработано 8.5.2009г. Еcли Вы пришли с поискового сервера - посетите мою главную страничкуНа главной странице Ва узнаете, как я могу помочь Вам в написании офисной программы любой сложности в соответствии с Вашими запросами. И найдете ряд програм или ссылок на образцы. Кроме того - на главной странице Вы найдете бесплатные программы: программы комплекса Veles - программы для автолюбителей, программы из раздела графика - программы для работы с фото, сделанными цифровым фотоаппаратом, программу Bricks - игрушку для детей и взрослых, программу записную книжку, программу TellMe - говорящий Русско-Английский разговорник - программу для тех, кто собирается погостить за бугром или повысить свои знания в английском, теоретический материал по программированию в среде Borland C++ Builder, C# (Windows приложения и ASP.Net Web сайты).
|