Открылся форум посвещеный программированию, где можно обсуждать и задавать любые вопросы по C++, C#, Visual Basic, Windows Forms

Форум

  6. Создание многооконного приложения, Редактирование текста формата .rtf, перетаскивание данных между элементами управления RichTextBox методом “drag and drop”.

            Создайте новый проект и поменяйте несколько свойств в форме: IsMdiContainer в True(чтобы дочерние окна открывались в форме), Text в Блокнот. Теперь добавьте menuStrip1 и создайте несколько кнопок для работы с файлами и текстом:

 

После добавления menuStrip1 в форме надо поменять свойство MainMenuStrip в menuStrip1. Добавьте также toolStrip1 и создайте несколько кнопок: Открыть, сохранить и т.д. и добавим соответствующие иконки. При создании кнопок меняем свойство ToolTipText на соответствующую функцию кнопки, например для кнопки создать – Создать файл и т.д. Тогда при наведении курсора на кнопку появляется соответствующая надпись. Иконки я копировал из другого приложения, т.е. делал снимок экрана и редактировал в Paint:

 

 

Теперь можно создавать дочернюю форму. Заходим в меню: ProjectAdd 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 - Продолжение »

Конструктор сайтов - uCoz