Разработка gui. Создание sdiприложений обработка событий
Скачать 361.78 Kb.
|
public String DocName;Переключаемся в код формы frmmain и в классе frmmain объявляем переменную private int openDoc; Присваиваем переменной DocName часть названия по шаблону, в который включен счетчик числа открываемых документов, затем это значение передаем свойству Text создаваемой формы frm: private void mnunew_Click(object sender, EventArgs e) { frm = new blank(); frm.DocName = "Документ " + ++openDoc; frm.Text = frm.DocName; frm.MdiParent = this; frm.Show(); } Для каждого пункта меню пишем обработчики событий, выпол- няющие соответсвтвующие пункту действия. Перечисление 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. Вырезание, копирование и вставка текстовых фрагментов. При создании нового документа он сразу будет занимать всю область глав- ной формы. Для этого установим свойство WindowState формы blank Maximized. Создадим обработчики для стандартных операций выреза- ния, копирования и вставки. Элемент управления RichTextBox имеет свойство SelectedText, которое содержит выделенный фрагмент текста. Оно будет использоваться при работе с текстом. В коде формы blank объявляем переменную, в которой будет храниться буферизованный фрагмент текста: 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 переключает фокус на текущую форму, если их открыто несколько, и вызывает один из методов, определен- ных в дочерней форме. Теперь можно выполнять все стандартные опе- рации с текстом. Контекстное меню. Дублирует некоторые действия основного меню. Добавим элемент управления contextMenuStrip из окна ToolBox на форму blank. Добавляем пункты контекстного меню точно так же, как мы это делали для главного. Свойства Text и Shortcut пунктов меню оставляем прежними. Если мы установим затем для свойства ShowShortcut значение false, то соче- тания клавиш будут работать, но в самом меню отображаться не будут. Свойства Name будут следующими: для пункта Cut – cmnuCut, для Сopy – cmnuCopy и т. д. В обработчике пунктов просто вызываем соответствующие ме- тоды: р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, по- скольку нам нужно отображать меню именно в текстовом поле. Запус- каем приложение – теперь в любой точке текста доступно меню. Для пункта 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); 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); 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); 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); frm.Save(frm.DocName); } Теперь, если мы работаем с несохраненным документом, пункт Save неактивен, после сохранения он становится активным и, кроме того, работает сочетание клавиш Ctrl+S. Можно сохранить копию те- кущего документа, вновь воспользовавшись пунктом меню Save As. Сохранение файла при закрытии формы. Всякий раз, когда мы закрываем документ Microsoft Word, в который внесли изменения, по- является окно предупреждения, предлагающее сохранить документ. Добавим аналогичную функцию в наше приложение. В классе blank создаем переменную, которая будет фиксировать сохранение документа: public bool IsSaved = false;В обработчик методов Save и Save As формы frmmain добавляем изменение значения этой переменной: private void mnuSave_Click(object sender, EventArgs e) { … frm.IsSaved = true; } private void mnuSaveAs_Click(object sender, EventArgs e) { … frm.IsSaved = true; } Переходим в режим дизайна формы blank, и в окне свойств пере- ключаемся на события формы, щелкнув на значок с молнией. В поле события FormClosed дважды щелкаем и переходим в код: private void blank_FormClosed(object sender, FormClosedEventArgs e) { if(IsSaved ==true) if(MessageBox.Show("Do you want save changes in " + this.DocName + "?", "Message", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == .DialogResult.Yes) { this.Save(this.DocName); } } OpenFileDialog и SaveFileDialog для SDI-приложений. При соз- дании MDI-приложений приходится разделять код для открытия и со- хранения файлов, как мы делали для приложения NotepadC#. В случае SDI-приложений весь код будет находиться в одном обработчике. Cоздаем новое приложение, называем его TextEditor. На форме разме- щаем элемент управления TextBox и устанавливаем следующие свой- ства (табл. 4.3). Т а б л и ц а 4.3 Свойства элемента управления TextBox
Добавляем на форму элемент menuStrip1, в котором будет всего три пункта – File, Open и Save (свойства пунктов см. в табл. 4.2). Из окна ToolBox перетаскиваем элементы OpenFileDialog и SaveFileDialog – свойства этих элементов в точности такие же, как и у диалогов приложения NotepadC#. Переходим в код формы. Добавляем обработчик для пункта меню Open: private void mnuOpen_Click(object sender, EventArgs e){ openFileDialog1.ShowDialog(); String fileName = openFileDialog1.FileName; FileStream filestream= File.Open(fileName, FileMode.Open, Fi- leAccess.Read); if(filestream != null) { StreamReader streamreader = new StreamReader(filestream); txtBox.Text = streamreader.ReadToEnd(); filestream.Close(); } } Добавляем обработчик для пункта меню Save: private void mnuSave_Click(object sender, EventArgs e) { saveFileDialog1.ShowDialog(); String fileName=saveFileDialog1.FileName; FileStream filestream = File.Open(fileName, FileMode.Create, Fi- leAccess.Write); if(filestream != null) { StreamWriter streamwriter = new StreamWriter(filestream); streamwriter.Write(txtBox.Text); streamwriter.Flush(); filestream.Close(); } } |