?
Глава 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 сайты).
|