- •Программирование на языке c#
- •3.1. Общие принципы 27
- •Введение
- •1 . Базовые элементы языка c#
- •1.1. Структура программы
- •Типы данных
- •1.3. Арифметические и логические операции
- •1.4. Условный оператор и оператор выбора
- •1.5. Ввод/вывод в консольном режиме
- •1.6. Комментарии
- •1.7. Массивы
- •1.8. Операторы цикла
- •1.9. Работа со ступенчатыми массивами
- •Контрольные вопросы
- •2. Работа с функциями
- •2.1. Общие принципы
- •2.2. Процедурное программирование в c#
- •Контрольные вопросы
- •3. Объектно-ориентированное программирование на c#
- •3.1. Общие принципы
- •3.2. Объявление и работа с классами
- •3.3. Перегрузка операторов
- •3.4. Индексаторы
- •3.5. Свойства
- •Использование класса в качестве типа данных
- •3.7. Работа со структурами
- •3.8. Наследование
- •3.9. Ссылки на объекты
- •3.10. Конструктор копирования
- •3.11. Виртуальные методы
- •3.12. Абстрактные методы и классы
- •3.13. Интерфейсы
- •3.14. Делегаты и события
- •3.15. Исключительные ситуации
- •Контрольные вопросы
- •4. Среда Microsoft Visual Studio 2005
- •4.1. Простейший пример
- •4.2. Средства управления работой программы
- •4.3. Создание меню
- •4.4. Ввод/вывод массивов
- •4.4.1. Ввод/вывод и обработка одномерного массива-строки
- •4.4.2. Ввод/вывод и обработка одномерного массива-столбца
- •4.4.3. Ввод/вывод и обработка двумерного массива
- •4.4.4. Форматированный ввод/вывод двумерного массива
- •4.5. Создание многооконных приложений
- •4.5.1. Создание sdi –приложения
- •4.5.2. Создание mdi –приложения
- •Контрольные вопросы
- •5. Объектно-ориентированное программирование в Microsoft Visual Studio 2005
- •5.1. Дополнение класса формы средствами решения прикладной задачи
- •5.2. Создание отдельных классов
- •5.3. Передача в классы указателей на формы
- •5.4. Создание форм в классах пользователя
- •Контрольные вопросы
- •Заключение
- •Библиографический список
4.5.2. Создание mdi –приложения
В MDI –приложении существует одна главная форма и множество подчиненных. Чтобы окно Form1 стала главным, поменяем значение его свойства IsMdiContainer на True. Разрешается и создание окон, которые открывают из главного окна, но не являются подчиненными. Но такими окнами нельзя управлять из главного окна. В нашем приложении будут:
Главное окно с меню.
Окно «О программе».
Динамически создаваемое диалоговое окно.
Окно, которое можно создавать многократно из главного.
Окно, которое можно создать из главного в единственном экземпляре.
Убедительно рекомендуем: не размещайте на главном окне ничего, кроме меню! Пусть меню имеет следующую структуру:
Файл Окно Диалог Помощь
Выход Создать Открыть О программе
Каскад
Мозаика горизонтально
Мозаика вертикально
Закрыть текущее
Закрыть все
Единственная форма
Создание окна «О программе» ничем не отличается от рассмотренного выше и мы на этом останавливаться не будем.
Переходим к рассмотрению диалогового окна, которое может создаваться и уничтожаться по ходу работы с программой. (Диалоговое окно, которое существует всегда и которое может лишь появиться на экране и исчезнуть с него, было рассмотрено выше и, таким же образом можно с ним работать и в MDI –приложении). Очевидно, что если диалоговое окно уничтожается, то все его компоненты потеряют свои значения и чтобы этого не случилось, следует их где-то хранить. Мы используем для этого переменные в классе главной формы. Внешний вид диалогового окна приведен на рис. 4.6.
Рис. 4.6
Нанесенные на него компоненты нам знакомы, они имеют имена rB1, rB2, cB1, cB2, tB1. У всех атрибут доступа (свойство Modifiers) изменен на public. Кнопки ОК и CANCEL по традиции позволяют закрыть окно с (без) сохранением внесенных изменений. Нам предстоит решить следующие задачи:
Открыть диалоговое окно с присвоением текущих значений его компонентам.
Работа с диалоговым окном.
Закрытие окна с сохранением, в случае необходимости, внесенных изменений.
Для хранения внесенных в диалоговое окно значений в то время, когда само окно не существует, объявим в классе главного окна (у нас Form1) следующие переменные:
static public int rgi;//для хранения номера выбранной радиокнопки
static public Boolean b1,b2;//для кнопок выбора
static public string s1; // для строки редактирования
Атрибут доступа public необходим, чтобы можно из диалогового окна к ним обращаться. Атрибут static позволяет ссылаться на эти переменные через имя класса.
Для присвоения начальных значений этим переменным в момент запуска приложения свяжем с событием главного окна Load (возникает в момент загрузки формы в момент запуска приложения) следующую функцию:
private void Form1_Load(object sender, EventArgs e)
{
rgi = 0;
b1 = false;
b2 = true;
s1 = "I love Moscow";
}
Открытие этого окна (пункт меню Диалог – Открыть):
private void открытьToolStripMenuItem_Click(object sender, EventArgs e)
{
Form2 f2;
f2 = new Form2();
switch(rgi)
{ case 0:
f2.rB1.Checked=true;
break;
case 1:
f2.rB2.Checked=true;
break;
}
f2.cB1.Checked = b1;
f2.cB2.Checked = b2;
f2.tB1.Text = s1;
f2.ShowDialog();
}
Работа с окном ничего нового для нас не содержит, и мы на этом останавливаться не будем.
Закрытие окна кнопкой CANCEL: Close();
Закрытие окна кнопкой OK: сохранение значений и закрытие.
private void button1_Click(object sender, EventArgs e)
{
Form1.s1 = tB1.Text;
Form1.b1 = cB1.Checked;
Form1.b2 = cB2.Checked;
if (rB1.Checked) Form1.rgi = 0;
else Form1.rgi = 1;
Close();
}
Многократно создаваемое окно представлено на рис. 4.7.
Рис. 4.7
Создание окна (создавать можно много подобных окон):
private void создатьToolStripMenuItem_Click(object sender, EventArgs e)
{
Form3 f3;
f3 = new Form3();
f3.MdiParent = this; // задаем, что созданное окно
//является подчиненным для окно, из которого оно создано
f3.label1.Text = s1;
f3.Show();
}
Примечание. Использовать для показа подчиненных окон функцию ShowDialog нельзя!
Управление подчиненными окнами осуществляется стандартными средствами
private void каскадToolStripMenuItem_Click(object sender, EventArgs e)
{
this.LayoutMdi(MdiLayout.Cascade); //располагать каскадом
}
private void мозаикаГоризонтальбноToolStripMenuItem_Click(object sender, EventArgs e)
{ // горизонтальная мозаика
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-приложениях возможно изменение меню в главном окне при открытии того или иного подчиненного окна. Для этого создаем меню в подчиненном окне. При открытии этого окна оно соединяется с меню главного окна.