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 - Продолжение »