Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод вказ до комп практ ВП 2012-13.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
24.74 Mб
Скачать

Создание mdi-приложений.

Для создания MDI необходимо:

- чтобы решаемая пользователем задача требовала одновременно несколько открытых документов. Примером задач такого рода является текстовый редактор или, как в приведенном выше примере, программа просмотра документов,

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

- обязательно следует предусмотреть пункт меню Window, который позволял бы пользователю изменять положение открытых окон друг относительно друга (налагая их друг на друга в виде черепицы или каскада) и предоставлял бы ему список всех открытых окон.

Еще одной особенностью MDI-приложений является то, что если имеется некоторое открытое окно и в этом окне существует некоторое меню, то оно должно быть интегрировано в основное меню приложения.

Любое MDI-приложение состоит, по крайней мере, из двух разных окон. Первое окно называется MDI-контейнером, а окно, которое может быть открыто в контейнере, называется дочерним MDI-окном. При упоминании первого окна будут использоваться взаимозаменяемые термины "MDI-контейнер" и "основное окно", а при упоминании второго — термины "дочернее MDI-окно" ИЛИ просто "дочернее окно".

При создании MDI-приложения следует:

1. Создать Windows Application в Visual Studio.

2. Чтобы превратить основное окно приложения из формы в MDI-контейнер, достаточно просто присвоить свойству формы isMdiContainer значение true. При этом произойдет изменение цвета фона, указывающее на то, там не следует размещать видимые управляющие элементы, хотя такая возможность по-прежнему существует и может при определенных обстоятельствах оказаться полезной.

3. Для создания дочернего окна следует добавить в проект новую форму, выбрав Windows Form из диалогового окна, которое открывается при выборе пункта меню Project | Add New Item.

4. Эта форма становится дочерним окном, когда его свойству MdiParent присваивается ссылка на основное окно. Этому свойству нельзя присваивать значение с помощью панели Properties, это необходимо выполнять программным путем.

До того, как появится возможность выводить MDI-приложение на экран в его основном виде, нужно выполнить еще две вещи:

1. Необходимо передать MDI-контейнеру информацию о том, какие окна должны выводиться.

2. Затем вывести их, для чего следует просто создать новый экземпляр формы, которую вы собираетесь выводить, а затем вызвать для нее метод show(). Конструктор формы, предназначенной для вывода в качестве дочернего окна, должен привязаться к родительскому контейнеру. Это достигается за счет присваивания его свойства MdiParent экземпляру MDI-контейнера.

Стандартный делегат

Для большего понимания такого сложного термина приведем простой «жизненный» пример: Дядя Федор и кот Матроскин отправились ловить рыбу. На берегу они расставили свои удочки и решили, что один из них будет следить за клевом, а другой, дабы рационально и с пользой провести это время, либо червей копать, либо просто ОТДЫХАТЬ. Кроме того, конструкции удочек значительно отличались, поэтому было принято решение просто прикрепить инструкции по использованию к каждой из них. Делегатом в таком важном деле был назначен Дядя Федор. Другими словами:

ДЕЛЕГАТ – это представитель, наделенный особыми полномочиями определенными заранее (в нашем случае, «обработать» клюющую рыбу, насадить нового червяка, вообщем, вести процесс рыбалки). В отличие от полномочий - действий делегата, заранее не известно случившееся событие, инициирующее его работу (клюет рыба, сорвалась рыба …). А как именно реагировать при наступлении того самого события, делегату станет известно из предопределенной инструкции.

В любом случае, делегат, настроенный на метод, должен обеспечить реакцию на данное событие.

public delegate void EventHandler(object sender, EventArgs e);

В этом процессе кроме делегата (Дяди Федора) есть также другие участники:

1) событие, произошедшее с удочкой (object sender).

2) инструкция по использованию среагировавшей удочки (EventArgs e).

Инициатор действия - это всегда sender (объект отправитель, источник события), а второй участник (инструкция по использованию удочкой, на которую воздействует sender) – тип, содержащий спецификацию для данного события информацию (предопределённый класс EventHandler, в котором хранится информация о событии). Делегат - установленым образом обрабатывает послание sender-а, согласно инструкции EventArgs.

При создании самого делегата–представителя класса–делегата EventHandler, прежде всего, определяется соответствующий метод, выполнение которого обеспечивает реакцию на событие.

Таким образом, для реализации перехвата события достаточно использовать:

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

2. предопределённый класс EventHandler для реализации ссылки на метод–обработчик события.

Комп'ютерний практикум №2. Обзор управляющих элементов и получение навыков работы с ними. Диалоговые окна. OpenFileDialog. SaveFileDialog. OpenFileDialog и SaveFileDialog для SDI-приложений. FontDialog. ColorDialog. Элемент управления NotifyIcon.

Цель: изучение класса Control, основных свойств и методов стандартных элементов управления, изучение класса CommonDialog.

Ход работы (первой части лабораторного занятия).

I. Изучение класса Control

  1. Создайте приложение TestMenuToolboxStatus.

  2. Перетащите элемент управления MenuStrip на форму, что позволит вводить текст меню непосредственно в элементы меню и создайте следующее меню (рис.1).

Рис. 1  Простое меню на форме

  1. При двойном щелчке на пункте меню Visual Studio автоматически сгенерирует оболочку для обработчика события Click и перейдет в окно кода.

  2. Для тестирования меню создайте обработчик пункта меню "Мое действие", который будет сообщать, что выбран именно этот пункт меню.

private void моеДействиеToolStripMenuItem_Click(object sender, EventArgs e)

{

MessageBox.Show("Пункт меню");

}

5. Реализуйте следующее: элемент управления TextBox содержит в себе простейшее контекстное меню, дублирующее действия подменю Edit (рис. 2):

Рис. 2.  Контекстное меню элемента TextBox

Для этого:

5.1. Перетащите элемент управления contextMenuStrip.

5.2. Создайте пункты Cut, Copy, Paste, SelectAll и обработчики для них:

private void toolStripMenuItem2_Click(object sender, EventArgs e)

{

textBox1.Cut();

}

private void copyToolStripMenuItem_Click(object sender, EventArgs e)

{

textBox1.Copy();

}

private void pasteToolStripMenuItem_Click(object sender, EventArgs e)

{

textBox1.Paste();

}

private void deleteToolStripMenuItem_Click(object sender, EventArgs e)

{

textBox1.SelectAll();

}

5.3. Определите, где будет появляться контекстное меню. Элемент TextBox имеет свойство ContextMenu, где мы укажем Name контекстного меню ( в нашем случае это contextMenu1)

6. Перетащите элемент управления StatusStrip на форму. Откоройте выпадающий список этого объекта на форме и выберите StatusLable:

Рис. 3.  Добавляем метку в строку состояния

7. Для отображения информации о пункте меню, на который наведена мышка необходимо:

7.1. В дизайнере формы выделить пункт, перейти на вкладку Properties и открыть окно событий, нажав кнопку На данной вкладке необходимо выделить событие MouseEnter и в поле ввода сделать двойной щелчок.

7.2. Система сгенерирует код обработчика, который привести к виду:

private void моеДействиеToolStripMenuItem_MouseEnter(object sender, EventArgs e)

{

toolStripStatusLabel1 = "Будет выведено сообщение";

}

После компиляции получим следующее:

Рис. 4.  Вывод сообщения в строке состояния

7.3. Для изменения текста при потере фокуса мыши на исходный, необходимо воспользоваться событием "MouseLeave", которое генерируется, когда мышь перемещается (покидает) с пункта меню. Обработчик данного события примет следующий вид:

private void моеДействиеToolStripMenuItem_MouseLeave(object sender, EventArgs e)

{

toolStripStatusLabel1.Text = "";

}

7.4. Самостоятельно сформировать соответствующие события MouseEnter и MouseLeave для всех подпунктов меню и создать для них обработчики.

8. Подписать всем компонентам на форме ToolTips.

ІІ. UseListAndCombo

Цель: научиться использовать элементы ListBox и ComboBox.

ЗАДАЧА:

  1. Выполните последовательность действий:

- разместите на форме: textBox1, button1, comboBox1;

- реализуйте метод нажатия на кнопку следующим образом:

private void button1_Click(object sender, EventArgs e)

{

comboBox1.Items.Add(textBox1.Text);

}

Это даст возможность добавить в выпадающий список введенное значение в поле ввода.

  1. Самостоятельно: добавить еще две кнопки и listBox1. При нажатии на кнопки реализовать добавление/исключение выбранного значения выпадающего списка в listBox1 (перенос осуществлять с удалением значения из соотв. списка)

Рис. 5. 

ІІІ. Изучение диалоговых окон.

    1. Создайте приложение TestDialogs.

    2. На главной форме проекта разместить компонент RichTextBox, полосу главного меню (используя Insert Standard Items), и панель инструментов toolStrip, на которой дублируются пункты меню:

Рис. 6. Пример формы

3. Для работы с файловыми потоками в коде формы blank подключаем пространство имен System.IO:

using System.IO;

  1. Перетащите на форму OpenFileDialog и приведите к виду:

Рис.7. Свойства OpenFileDialog

5. В обработчике события нажатия соответствующего пункта меню прописать:

OpenFileDialog fd = new OpenFileDialog();

fd.Filter = "Text format (*.txt)|*.txt|Rich Text (*.rtf)|*.rtf";

if (fd.ShowDialog() == DialogResult.OK)

{

// если выбрали текст

if (fd.FilterIndex == 1)

richTextBox1.LoadFile(fd.FileName, RichTextBoxStreamType.PlainText);

else

richTextBox1.LoadFile(fd.FileName, RichTextBoxStreamType.RichText);

}

  1. В обработчике события для SaveFileDialog:

SaveFileDialog fd = new SaveFileDialog();

fd.Filter = "Text format (*.txt)|*.txt|Rich Text (*.rtf)|*.rtf";

if (fd.ShowDialog() == DialogResult.OK)

{

// если выбрали текст

if (fd.FilterIndex == 1)

richTextBox1.SaveFile(fd.FileName, RichTextBoxStreamType.PlainText);

else

richTextBox1.SaveFile(fd.FileName, RichTextBoxStreamType.RichText);

}

  1. По аналогии создать обработчики диалогов ColorDialog и FontDialog:

ColorDialog d = new ColorDialog();

if (d.ShowDialog() == DialogResult.OK)

{

richTextBox1.SelectionColor = d.Color;

}

FontDialog d = new FontDialog();

if (d.ShowDialog() == DialogResult.OK)

{

richTextBox1.SelectionFont = d.Font;

}

  1. В обработчике события закрытия формы:

private void Form1_FormClosing(object sender,

FormClosingEventArgs e)

{

if ( MessageBox.Show("Вы уверены ?", "Вопрос",

MessageBoxButtons.YesNo

, MessageBoxIcon.Question

, MessageBoxDefaultButton.Button2

)

!= DialogResult.Yes

)

{

e.Cancel = true;

}

}