Открылся форум посвещеный программированию, где можно обсуждать и задавать любые вопросы по C++, C#, Visual Basic, Windows Forms |
6. Создание многооконного приложения, Редактирование текста формата .rtf, перетаскивание данных между элементами управления RichTextBox методом “drag and drop”.Создайте новый проект и поменяйте несколько свойств в форме: IsMdiContainer в True(чтобы дочерние окна открывались в форме), Text в Блокнот. Теперь добавьте menuStrip1 и создайте несколько кнопок для работы с файлами и текстом:
После добавления menuStrip1 в форме надо поменять свойство MainMenuStrip в menuStrip1. Добавьте также toolStrip1 и создайте несколько кнопок: Открыть, сохранить и т.д. и добавим соответствующие иконки. При создании кнопок меняем свойство ToolTipText на соответствующую функцию кнопки, например для кнопки создать – Создать файл и т.д. Тогда при наведении курсора на кнопку появляется соответствующая надпись. Иконки я копировал из другого приложения, т.е. делал снимок экрана и редактировал в Paint:
Теперь можно создавать дочернюю форму. Заходим в меню: Project – Add Windows Form… появиться окно диалога нового элемента с именем Формы по умолчанию: Form2.cs В новую форму надо добавить richTextBox и поменять свойства: Location – 0;0, Size - 292; 273, ScrollBars – ForcedBoth, WordWrap – False, Anchor - Top, Bottom, Left, Right Это мы уже делали в третьем уроке по созданию редактора текста. Теперь надо написать код для каждой кнопки. Нажимаем два раза на кнопку создать файл и пишем такой код: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;
namespace _6ManyWindow { public partial class Form1 : Form { public Form1() { InitializeComponent(); } int childFormNumber = 1; string Dir = null; private void NewStripButton_Click(object sender, EventArgs e) { FolderBrowserDialog ff = new FolderBrowserDialog(); ff.Description = "Выберите папку для сохранения файла"; if (Dir == null) { if (ff.ShowDialog() == DialogResult.OK) { Dir = ff.SelectedPath; } } if (Dir != null) { Form childForm = new Form2(); childForm.MdiParent = this; childForm.Text = Dir + "\\Безымянный " + childFormNumber++ + ".rtf"; childForm.Show(); } }
} }
В этом коде, сразу после нажатия, появляется диалог выбора папки: FolderBrowserDialog и, после выбора папки, текстовой переменной Dir присваивается значение выбранной папки, которое становится значением по-умолчанию. Потом создается новая, дочерняя форма: Form childForm = new Form2(); и помещается на форму: childForm.MdiParent = this; после этого в заголовке дочерней формы появляеться адрес файла на диске. Теперь пропишем код открыть файл и сохранить: private voidOpenStripButton_Click(object sender, EventArgs e) { OpenFileDialogopenFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Text Files (*.rtf *.txt)|*.txt;*.rtf|All Files (*.*)|*.*"; if(openFileDialog.ShowDialog() == DialogResult.OK) { FormchildForm = new Form2(); childForm.MdiParent = this; childForm.Show(); foreach (Form2 child in this.MdiChildren) { if (this.ActiveMdiChild == child) { child.Open(openFileDialog.FileName); } } } } private voidSaveStripButton_Click(object sender, EventArgs e) { SaveFileDialog of = new SaveFileDialog(); foreach (Form2 child in this.MdiChildren) { if (this.ActiveMdiChild == child) { of.FileName = child.Text; of.Filter = "Text Files (*.rtf *.txt)|*.txt;*.rtf|All Files (*.*)|*.*"; if(of.ShowDialog() == System.Windows.Forms.DialogResult.OK & of.FileName.Length > 0) { child.Save(of.FileName); } } } } Здесь в коде открытия файла сначала появляется диалог открытия файла, потом создается новая форма, которой присваивается имя по результату openFileDialog. После этого в цикле foreach ищем активную(только что открытую) форму и вызываем подпрограмму в Form2: child.Open(openFileDialog.FileName;), которая добавляет текст из выбранного файла. В коде сохранения файла происходит примерно тоже самое. Для реализации этого кода осталось написать подпрограммы в Form2. Заходим на вкладку второй формы, нажимаем правой кнопкой и выбираем из выпадающего меню: Viem Code. Остается набрать код и программа может открывать и сохранять файлы формата .rtf: using System; using System.Collections.Generic; usingSystem.ComponentModel; using System.Data; using System.Drawing; usingSystem.Linq; using System.Text; using System.Windows.Forms;
namespace_6ManyWindow { public partial class Form2 : Form { public Form2() { InitializeComponent(); } public void Open(string Name) { richTextBox1.LoadFile(Name, RichTextBoxStreamType.RichText); this.Text = Name; } public void Save(string Name) { richTextBox1.SaveFile(Name, RichTextBoxStreamType.RichText); this.Text = Name; } } } Обратите внимание, что вместо обычного private здесь пишеться: public. Это сделанно для того, чтобы подпрограмма вызывалась из кода первой формы. Кроме того, при вызове подпрограммы передается текстовая переменная: child.Open(openFileDialog.FileName); в данном случае это имя выбранного файла, уже в подпрограмме это имя присваивается переменной: Name. Теперь пишем код для кнопок вырезать, копировать и вставить: private void CutStripButton_Click(object sender, EventArgs e) { foreach (Form2 child in this.MdiChildren) { if (this.ActiveMdiChild == child) { child.Cut(); } } }
private voidCopyStripButton_Click(object sender, EventArgs e) { foreach (Form2 child in this.MdiChildren) { if (this.ActiveMdiChild == child) { child.Copy(); } } }
private voidPasteStripButton_Click(object sender, EventArgs e) { foreach (Form2 child in this.MdiChildren) { if (this.ActiveMdiChild == child) { child.Paste(); } } } Здесь, как и в предыдущих операциях сначала находим активную форму, после чего вызываем подпрограмму в ней, код для которой представлен ниже: public void Cut() { Clipboard.SetText(richTextBox1.SelectedRtf, TextDataFormat.Rtf); richTextBox1.SelectedRtf = ""; } public void Copy() { Clipboard.SetText(richTextBox1.SelectedRtf, TextDataFormat.Rtf); } public void Paste() { richTextBox1.SelectedRtf = Clipboard.GetText(TextDataFormat.Rtf); richTextBox1.Paste(DataFormats.GetFormat(DataFormats.Bitmap)); } В операции вырезать, выделенный текст помещается в буфер обмена в формате Rtf: Clipboard.SetText(richTextBox1.SelectedRtf, TextDataFormat.Rtf); и затем удаляется. Остальные операции также используют буфер обмена. В операции вставить(Paste) добавлена команда вставить картинку, потому что если мы копируем картинку из Ворда, то она содержится в формате rtf, и успешно вставляется, а из Paintа – нет, с добавлением строки: richTextBox1.Paste(DataFormats.GetFormat(DataFormats.Bitmap)); картинка успешно вставляется. Во многих приложениях используется контекстное меню. Добавим на Form2 - Продолжение » |