Создание текстового редактора windows forms

Создание текстового редактора windows forms

БлогNot. Visual C++: пишем простой многодокументный редактор текста RTF

Visual C++: пишем простой многодокументный редактор текста RTF

То есть, MDI-приложение. Пример вот отсюда как-то мне не очень нравится, потому что написан левой ногой и не использует стандартные возможности по управлению дочерними окнами. Этот пример тоже, в общем, пишется левой ногой и прямо сейчас, но постараемся сделать хотя бы классическую картинку «много окон документов внутри главного окна приложения».

В 2015-й (или выше) Visual Studio создадим приложение Windows Forms на C++.

На форму приложения перетащим главное меню MenuStrip и стандартные диалоги для работы с файлами OpenFileDialog, SaveFileDialog. У диалогов достаточно настроить свойство Filter на нужный нам тип файлов, с которым будем работать, выберем » Файлы RTF|*.rtf «.

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

Также не забудем установить родительской форме свойство IsMdiContainer = true.

Затем добавим к приложению ещё одну форму (меню Проект — Добавить новый элемент — Viual C++ — UI — Форма Windows Forms). У меня она назвалась MyForm1 , пусть так и остаётся.

Настроим новую форму, перетащив на неё какое-нибудь многострочное текстовое поле, например, стандартный RichTextBox и установив у него в окне Свойств размер во всю область дочернего окна (свойство Dock = Fill).

В дочернее окно добавим также контекстное меню contextMenuStrip1, которое будет вызываться правой кнопкой мыши. Предусмотрим там 4 пункта (Вырезать, Копировать, Копировать все, Вставить). Это позволит приложению обмениваться кусками текста между окнами через системный Буфер Обмена. Сначала все пункты отключены (свойство Enabled = false).

Это меню укажем в свойстве ContextMenuStrip компоненты richTextBox1.

Добавим в дочернее окно его собственный SaveFileDialog, чтобы можно было выбрать имя файла для сохранения, если мы закрываем дочернее окно с изменённым текстом. На диалог поставим такой же фильтр, как у родительской формы. Вообще, конечно, лучше было бы не плодить компоненты, а воспользоваться неким отдельным классом-наследником SaveFileDialog, который мы могли написать.

Теперь дочернюю форму мы пропишем вверху файла родительской формы MyForm.h :

а весь остальной код как обычно писать в MyForm.h под директивой #pragma endregion :

Мы уже умеем создавать обработчики событий двойным кликом из списка событий в окне «Свойства», так что приведу только «внутренности» функций-обработчиков стандартных событий.

По выбору пункта меню «Создать» просто вызовем только что написанный метод:

Пункт «Выход» запрограммировать тоже просто, будем вызывать стандартный метод закрытия главной формы:

Для записи файла, имя которого было введено или выбрано в стандартном диалоге сохранения, напишем обработчик пункта меню «Сохранить. «:

Здесь также видно, как обратиться к активному в настоящий момент дочернему окну или отследить ситуацию, при которой такого окна нет.

Пункт верхнего меню «Открыть. » будет выполнять довольно похожую работу — определять, есть ли активное дочернее окно, получать для него имя файла и выводить стандартный диалог открытия, после чего попытается сделать непосредственно загрузку из файла содержимого:

Читайте также:  Как проверить версию python windows

Удобство MDI-приложения в том, что при закрытии главного окна обработчки события FormClosing дочерних окон будут вызваны автоматически, так что каждому экземпляру дочернего окна достаточно будет позаботиться о сохранности только своего текста из своего RichTextBox.

При этом, отказ от сохранения какого-либо из текстов в дочерних окнах не будет означать отказа от закрытия приложения.

Ниже приведён обработчик события FormClosing главной формы. Комментарием показано, как можно было бы обойти в цикле все дочерние окна.

Если последний оператор закомментировать, нажатие кнопки «Отмена» в ответ на предложение сохранить любой из несохранённых файлов будет отменять и закрытие родительского окна.

Выбор пункта меню «Дата и время» вставит в конец текста активного окна текущие дату и время, примерно как в стандартном Блокнотике Windows (только там — в место расположения курсора). Эта функция добавлена просто для иллюстрации:

Наконец, пункт «Каскад» уложит каскадом имеющиеся дочерние окна, по аналогии легко сделать остальные стандартные «Укладки»:

Напишем что-нибудь в файле MyForm1.h , программируя функционал дочерних окон. Весь код будет располагаться после директивы #pragma endregion

Во-первых, позаботимся о том, чтобы пункты контекстного меню были доступны только тогда, когда они нужны.

Метод checkForClipboardFormat будет проверять, что находится в Буфере Обмена и разрешать вставлять только RTF:

Мы вызовем его в обрабтчике события загрузки (Load) дочерней формы:

Также напишем для richTextBox1 обработчики событий SelectionChanged (изменение выбора текста)

и TextChanged (изменение самого текста), имеющие схожие цели.

Пункт меню «Вырезать» будет программировать просто:

«Копировать все» тоже:

А вот обработчик пункта «Вставить» будет дополнительно проверять, есть ли в системном Буфере данные подходящего формата и не выделено ли что-то в тексте из richTextBox1:

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

Проект собирается. Теперь можно добавить в главное окно, например, панель инструментов с кнопками для изменения цвета, размера шрифта и т.п., что обычно бывает в текстовых редакторах.

Скачать архив .zip с папкой этого проекта Visual Studio 2015 (12 Кб)

В простейшем случае, добавив и настроив toolStripContainer , а на нём кнопку » B » (выделение жирным), мы можем написать примерно такой код для переключения шрифта контрола активного окна между жирным и обычным (обработка щелчка по кнопке):

25.09.2018, 18:06; рейтинг: 3034

Создание текстового редактора windows forms

Уроки Windows Forms C++/C#

Открытие и запись текстового файла в MVS C++

В этом уроке будет показан пример создания простого текстового редактора, поэтому обязательно посмотрите предыдущий урок. В данной программе мы будем открывать какой-то уже созданный текстовый файл и редактировать его или же сами писать текст и сохранять его, как новый текстовый файл в нужную вам папку. Ещё один явный признак текстового редактора – это если вы что-то написали и нажимайте крестик чтобы выйти – при этом программа спрашивает: “Сохранить изменения”. Создание такого текстового редактора как раз и будет рассматриваться в этом уроке. Для этого понадобяться следующие элементы: «MenuStrip», «textBox», «openFiledialog», «saveFiledialog». Работа с последними двумя рассматривается в “этом уроке”. Перетащите все эти элементы на форму, назовите заголовок «MenuStrip» «Файл» создайте в нём три пункта: «Открыть», «Сохранить как», «Выход», привяжите «textBox» ко всем сторонам формы, если не знаете включите «Multeline» и «ScrollBars->Vertical», как делать всё выше описанное посмотрите этот урок.Оформление программы:

Читайте также:  Редакторы текстовых файлов linux

В коде программы будут созданы «MyReader» и «MyWriter» , с помощью которых программа будет читать и записывать текст в файл. По мимо этого в коде создаётся кодировка, благодаря которой программа будет понимать русский текст. У формы нужно вызвать событие «FormClousing», о том как вызвать событие у элемента рассказывается в этом уроке. Код программы:

#pragma endregion private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) < this->Text = «Текстовый редактор»; openFileDialog1->FileName = «D:\\ВУЗ\\Text2.txt»; openFileDialog1->Filter = «Текстовые файлы (*.txt)|*.txt|All files (*.*)|*.*»; saveFileDialog1->Filter = «Текстовые файлы (*.txt)|*.txt|All files (*.*)|*.*»; > private: System::Void открытьToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) < openFileDialog1->ShowDialog(); if (openFileDialog1->FileName == nullptr) return; try < auto MyReader = gcnew IO::StreamReader(openFileDialog1->FileName, System::Text::Encoding::GetEncoding(1251)); textBox1->Text= MyReader->ReadToEnd(); MyReader->Close(); > catch (IO::FileNotFoundException^ Ситуация) < MessageBox::Show(Ситуация->Message + «\nФайл не найден», «Ошибка», MessageBoxButtons::OK, MessageBoxIcon::Exclamation); > catch (Exception^ Ситуация) < MessageBox::Show(Ситуация->Message, «Ошибка», MessageBoxButtons::OK, MessageBoxIcon::Exclamation); > > private: System::Void сохранитьКакToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) < saveFileDialog1->FileName = openFileDialog1->FileName; if (saveFileDialog1->ShowDialog() == Windows::Forms::DialogResult::OK) Save(); > void Save() < try < // Создание экземпляра StreamWriter для записи в файл: auto MyWriter = gcnew IO::StreamWriter(saveFileDialog1->FileName, false, System::Text::Encoding::GetEncoding(1251)); MyWriter->Write(textBox1->Text); MyWriter->Close(); textBox1->Modified = false; > catch (Exception^ Ситуация) < MessageBox::Show(Ситуация->Message, «Ошибка», MessageBoxButtons::OK, MessageBoxIcon::Exclamation); > > private: System::Void выходToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) < this->Close(); > private: System::Void Form1_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e) < if (textBox1->Modified == false) return; auto MeBox = MessageBox::Show(«Текст был изменён. \nСохранить изменения?», «Простой редактор», MessageBoxButtons::YesNoCancel, MessageBoxIcon::Exclamation); if (MeBox == Windows::Forms::DialogResult::No) return; if (MeBox == Windows::Forms::DialogResult::Cancel) e->Cancel = true; if (MeBox == Windows::Forms::DialogResult::Yes) < if (saveFileDialog1->ShowDialog() == Windows::Forms::DialogResult::OK) < Save(); return; >else e->Cancel = true; > > >; >

Результат: Следующий урок >>

Простое Windows-приложение — текстовый редактор

Рассмотрим пример проектирования стандартного оконного приложения. Простейшая последовательность действий:
1) визуальное проектирование интерфейса (перенос на форму с Панели элементов необходимых визуальных и не визуальных элементов);
2) генерация заготовок методов обработки событий, связанных с элементами управления;
3) программирование методов обработки событий.

Постановка задачи

Создать текстовый редактор с обязательными функциями работы с файлами «Открыть» и «Сохранить как», а также функциями редактирования текста. Выбор действий с файлами осуществлять через главное меню.

Реализация

Разместим на форме визуальный элемент textBox1 класса TextBox. Размер элемента сделайте чуть меньше размера формы, сместив его вниз от заголовка на 30-40 пикселей. Задайте свойство textBox1.MultiLine = true (для редактирования текста в несколько строк).

Перетащите с Панели элементов компонент menuStrip1 класса MenuStrip для создания меню.В левом верхнем углу рабочей области формы появится кнопка «Введите здесь» , а на панели невизульных компонентов отобразится элемент menuStrip1.

Читайте также:  Как указать dns windows

Для выбора имен файлов для их чтения и записи перетащим на эту же панель элементы openFileDialog1 (класс OpenFileDialog) и saveFileDialog1 (класс SaveFileDialog).

Кликнув по кнопке «Введите здесь», введите имя раздела меню «Файл» и добавьте ниже следующие пункты меню работы с файлами «Открыть», «Сохранить как» и «Выход». Ваша форма (вместе с панелью невизуальных элементов) будет выглядеть примерно так:
Примечание: для наглядности изменено свойство формы BackColor = Color.Peru. Первая группа действий закончена.

Вторая группа действий обеспечивает генерацию заголовков методов обработки событий, связанных к кнопками меню. Для этого дважды нажмите каждую из трех позиций меню, а также событию Load формы Form1 на закладке «События» панели «Свойства» поставьте в соответствие метод Form1_Load (двойной клик справа от в строке Load).

Откроем форму в режиме Кода (файл Form1.cs):

Перейдем к третьей группе действий — написанию кода для этих четырех методов.

Метод Form1_Load( ) используем для очистки поля компонента textBox1, для задания форматов файловых диалогов и имени файла — контрольного примера при его открытии:

Комментарий. При загрузке формы мы задаем свойство FileName объекта openFileDialog1 указанием имени файла для открытия, а также задаем фильтры для диалогов открытия и сохранения файлов. Сравните работу программы без использования этого метода.

В методе открытьToolStripMenuItem_Click( ) используется компонент openFileDialog1 для выбора имени файла для чтения. Если имя не выбрано (FileName = String.Empty), то работа метода завершается. Иначе создается новый экземпляр класса System.IO.StreamReader (var Читатель) с указанием имени файла и кодировки, данные из текстового файла переносятся в textBox1, объект Читатель закрывается. Добавлена обработка исключений, которые могут возникнуть при открытии файла:

Аналогично выполняется запись (сохранение) текстового файла:

Последний метод — закрытие формы — реализуется одним оператором:

Подготовим в блокноте текстовый файл Text2.txt и разместим его в подкаталоге data папки, где будет размещено ваше приложение. Запустим программу на выполнение. Добавьте в окне редактора несколько строк, сохраните файл с другим именем. Откройте новый файл и удалите часть текста в окне редактора.

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

ВЫВОД: В первом приближении поставленная задача решена. Данный пример приведен всего лишь для понимания:
во-первых, алгоритма действий разработчика визуального приложения «интерфейс, события-методы, реализация»;
во-вторых, удобства использования готовых компонентов (нам не пришлось программировать операции редактирования текста — стандартные события уже привязаны к компоненту textBox1);
в-третьих, целесообразности использования готовых компонентов (файловых диалогов) с точки зрения стандартизации интерфейса пользователя и программы.

Напомним, что в статье про классы мы отмечали, что в языке C# предусмотрено несколько разновидностей данных-членов и функций-членов. Пока мы подробно рассмотрели только поля и константы — как данные-члены, а также методы — как функции-члены класса. В следующих статьях мы рассмотрим события, как данные-члены класса и трехзвенную цепочку события-делегаты-методы. После чего вернемся к член-функциям класса: свойствам, конструкторам, финализаторам, операциям и индексаторам.

Оцените статью