Для каждого пункта меню пишем обработчики событий, выполняющие соответсвтвующие пункту действия

 

Перечисление MdiLayout

При работе с несколькими документами в MDI-приложениях удобно упорядочивать их на экране. В пункте меню Window реализуем процедуру выравнивания окон.

Создаем обработчиков:

private void mnuArrangeIcons_Click(object sender, EventArgs e) {

this.LayoutMdi(MdiLayout.ArrangeIcons);

}

private void mnuCascade_Click(Object sender, EventArgs e) {

this.LayoutMdi(MdiLayout.Cascade);

}

private void mnuTileHorizontal_Click(object sender, EventArgs e) {

this.LayoutMdi(MdiLayout.TileHorizontal);

}

private void mnuTileVertical_Click(object sender, EventArgs e) {

this.LayoutMdi(MdiLayout.TileVertical);

}

Метод LayoutMdi содержит перечисление MdiLayout, содержащее четыре члена. ArrangeIcons переключает фокус на выбранную форму, в свойстве MdiList пункта меню ArrangeIcons устанавливаем также значение true. При открытии нескольких новых документов окна располагаются каскадом, их можно расположить горизонтально — значение TileHorizontal или вертикально — значение TileVertical, а затем снова вернуть каскадное расположение — Cascade.

 

Вырезание, копирование и вставка текстовых фрагментов

С приложением работать будет удобней, если при создании нового документа он сразу будет занимать всю область главной формы. Для этого установим свойство WindowState формы blank Maximized. Теперь приступим к созданию обработчиков для стандартных операций вырезания, копирования и вставки. Элемент управления RichTextBox имеет свойство SelectedText, которое содержит выделенный фрагмент текста. На основании этого свойства и будут реализованы действия по работе с текстом. В коде формы blank объявляем переменную BufferText, в которой будет храниться буферизованный фрагмент текста:

private String BufferText;

 

Далее создаем соответствующие методы:

// Вырезание текста

public void Cut() {

this.BufferText = richTextBox1.SelectedText;

richTextBox1.SelectedText = “”;

}

// Копирование текста

public void Copy() {

this.BufferText = richTextBox1.SelectedText;

}

// Вставка

public void Paste() {

richTextBox1.SelectedText = this.BufferText;

}

// Выделение всего текста – используем свойство SelectAll элемента управления

// RichTextBox

public void SelectAll() {

richTextBox1.SelectAll();

}

// Удаление

public void Delete() {

richTextBox1.SelectedText = “”;

this.BufferText = «»;

}

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

private void mnucut_Click(object sender, EventArgs e) {

blank frm = (blank) (this.ActiveMdiChild);

frm.Cut();

}

private void mnucopy_Click(object sender, EventArgs e) {

blank frm = (blank)(this.ActiveMdiChild);

frm.Copy();

}

private void mnuselectAll_Click(object sender, EventArgs e) {

blank frm = (blank) (this.ActiveMdiChild);

frm.SelectAll();

}

private void mnupaste_Click(object sender, EventArgs e) {

blank frm = (blank) (this.ActiveMdiChild);

frm.Paste();

}

private void mnudelete_Click(object sender, EventArgs e) {

blank frm = (blank) (this.ActiveMdiChild);

frm.Delete();

}

Свойство ActiveMdiChild переключает фокус на текущую форму, если их открыто несколько, и вызывает один из методов, определенных в дочерней форме. Запускаем приложение. Теперь мы можем выполнять все стандартные операции с текстом.

 

Контекстное меню

Контекстное меню, дублирует некоторые действия основного меню. Элемент управления TextBox содержит в себе простейшее контекстное меню, дублирующее действия подменю Edit. Для того чтобы убедиться в этом, достаточно нанести этот элемент управления на форму и запустить приложение.

В нашем приложении NotepadC# в качестве текстового элемента мы используем RichTextBox. Добавим элемент управления contextMenuStrip из окна ToolBox на форму blank. Добавляем пункты контекстного меню точно так же, как мы это делали для главного меню (рисунок 4.3).

Свойство Text и Shortcut пунктов меню оставляем прежними. Если мы установим затем для свойства ShowShortcut значение false, то сочетания клавиш будут работать, но в самом меню отображаться не будут. Свойство Name будут следующими: для пункта Cut — cmnuCut, для Сopy — cmnuCopy и т.д.

 

 

Рисунок 4. 3 Пункты контекстного меню

 

В обработчике пунктов просто вызываем соответствующие методы:

рrivate void cmnuCut_Click(object sender, EventArgs e) {

Cut();

}

private void cmnuCopy_Click(object sender, EventArgs e) {

Copy();

}

private void cmnuPaste_Click(object sender, EventArgs e) {

Paste();

}

private void cmnuDelete_Click(object sender, EventArgs e) {

Delete();

}

private void cmnuSelectAll_Click(object sender, EventArgs e) {

SelectAll();

}

 

Необходимо определить, где будет появляться контекстное меню. Элемент RichTextBox, так же как и формы frmmain и blank, имеет свойство ContextMenuStrip, где мы и указываем contextMenuStrip1, поскольку нам нужно отображать меню именно в текстовом поле. Запускаем приложение — теперь в любой точке текста доступно меню.

 

5. Для пункта Format создать обработчики выбора цвета и шрифта самостоятельно.

 

Диалоговые окна

Выполняя различные операции с документом — открытие, сохранение, печать, предварительный просмотр, — мы сталкиваемся с соответствующими диалоговыми окнами. Разработчикам.NET не приходится заниматься созданием окон стандартных процедур: элементы OpenFileDialog, SaveFile Dialog, ColorDialog, PrintDialog содержат уже готовые операции.

 

OpenFileDialog

Добавьте на форму frmmain элемент управления OpenFileDialog из окна панели инструментов ToolBox.

Свойство FileName задает название файла, которое будет находиться в поле "Имя файла:" при появлении диалога. Свойство Filter задает ограничение файлов, которые могут быть выбраны для открытия — в окне будут показываться только файлы с заданным расширением. Через вертикальную разделительную линию можно задать смену типа расширения, отображаемого в выпадающем списке "Тип файлов". Здесь введено Text Files (*.txt)|*.txt|All Files(*.*)|*.* что означает обзор либо текстовых файлов, либо всех. Свойство InitialDirectory позволяет задать директорию, откуда будет начинаться обзор. Если это свойство не установлено, исходной директорией будет рабочий стол.

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

//Создаем метод Open, в качестве параметра объявляем строку адреса файла.

public void Open(String OpenFileName) {

if (OpenFileName == null) {

return;

}

else {

StreamReader sr = new StreamReader(OpenFileName);

richTextBox1.Text = sr.ReadToEnd();

sr.Close();

DocName = OpenFileName;

}

}

Добавим обработчик пункта меню Open формы frmmain:

private void mnuopen_Click(object sender, EventArgs e) {

//Можно программно задавать доступные для обзора расширения файлов

openFileDialog1.Filter = "Text Files (*.txt)|*.txt|All Files(*.*)|*.*";

//Если выбран диалог открытия файла, выполняем условие

if (openFileDialog1.ShowDialog() ==.DialogResult.OK) {

blank frm = new blank();

frm.Open(openFileDialog1.FileName);

//Указываем, что родительской формой является форма frmmain

frm.MdiParent = this;

//Присваиваем переменной DocName имя открываемого файла

frm.DocName = openFileDialog1.FileName;

//Свойству Text формы присваиваем переменную DocName

frm.Text = frm.DocName;

frm.Show();

}

}

 

Для корректного чтения кириллицы текст в блокноте должен быть сохранен в кодировке Unicode.

 

SaveFileDialog

Для сохранения файлов добавляем на форму frmmain элемент управления saveFileDialog1. Cвойства этого диалога в точности такие же, как у OpenFileDialog. Переходим в код формы blank:

//Создаем метод Save, в качестве параметра объявляем строку адреса файла.

public void Save(String SaveFileName) {

if (SaveFileName == null) {

return;

}

else {

StreamWriter sw = new StreamWriter(SaveFileName);

//Содержимое richTextBox1 записываем в файл

sw.WriteLine(richTextBox1.Text);

sw.Close();

//Устанавливаем в качестве имени документа название сохраненного файла

DocName = SaveFileName;

}

}

 

Добавляем обработчик пункта меню Save формы frmmain:

private void mnuSave_Click(object sender, EventArgs e) {

saveFileDialog1.Filter = "Text Files (*.txt)|*.txt|All Files(*.*)|*.*";

if (saveFileDialog1.ShowDialog() ==.DialogResult.OK) {

//Переключаем фокус на данную форму.

blank frm = (blank)(this.ActiveMdiChild);

//Вызываем метод Save формы blank

frm.Save(saveFileDialog1.FileName);

frm.MdiParent = this;

frm.DocName = saveFileDialog1.FileName;

frm.Text = frm.DocName;

}

}

Теперь файлы можно открывать, редактировать и сохранять. Однако, при сохранении внесенных изменений в уже сохраненном файле вместо его перезаписи вновь появляется окно SaveFileDialog. Изменим нашу программу так, чтобы можно было сохранять и перезаписывать файл. В конструкторе формы frmmain после InitializeComponent отключим доступность пункта меню Save: mnuSave.Enabled = false;

Переключаемся в режим дизайна формы frmmain и добавляем пункт меню Save As после пункта Save. Устанавливаем следующие свойства этого пункта: Name — mnuSaveAs, Shortcut — Ctrl+Shift+S, Text Save &As. В обработчике Save As вставляем вырезанный обработчик пункта Save и добавляем включение доступности Save: mnuSave.Enabled = true;

Сохранять изменения требуется как в только что сохраненных документах, так и в документах, созданных ранее и открытых для редактирования. Поэтому добавим в метод Open включение доступности пункта меню Save:

private void mnuOpen_Click(object sender, EventArgs e) {

mnuSave.Enabled = true;

}

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

private void mnuSave_Click(object sender, EventArgs e) {

//Переключаем фокус на данную форму.

blank frm = (blank) (this.ActiveMdiChild);

//Вызываем метод Save формы blank

frm.Save(frm.DocName);

}

Теперь, если мы работаем с несохраненным документом, пункт Save неактивен, после сохранения он становится активным и, кроме того, работает сочетание клавиш Ctrl+S. Можно сохранить копию текущего документа, вновь воспользовавшись пунктом меню Save As.

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: