Windows forms c текстовый редактор
Уроки Windows Forms C++/C#
Открытие и запись текстового файла в MVS C++
В этом уроке будет показан пример создания простого текстового редактора, поэтому обязательно посмотрите предыдущий урок. В данной программе мы будем открывать какой-то уже созданный текстовый файл и редактировать его или же сами писать текст и сохранять его, как новый текстовый файл в нужную вам папку. Ещё один явный признак текстового редактора – это если вы что-то написали и нажимайте крестик чтобы выйти – при этом программа спрашивает: “Сохранить изменения”. Создание такого текстового редактора как раз и будет рассматриваться в этом уроке. Для этого понадобяться следующие элементы: «MenuStrip», «textBox», «openFiledialog», «saveFiledialog». Работа с последними двумя рассматривается в “этом уроке”. Перетащите все эти элементы на форму, назовите заголовок «MenuStrip» «Файл» создайте в нём три пункта: «Открыть», «Сохранить как», «Выход», привяжите «textBox» ко всем сторонам формы, если не знаете включите «Multeline» и «ScrollBars->Vertical», как делать всё выше описанное посмотрите этот урок.Оформление программы:
В коде программы будут созданы «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 forms c текстовый редактор
Блог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 :
Мы уже умеем создавать обработчики событий двойным кликом из списка событий в окне «Свойства», так что приведу только «внутренности» функций-обработчиков стандартных событий.
По выбору пункта меню «Создать» просто вызовем только что написанный метод:
Пункт «Выход» запрограммировать тоже просто, будем вызывать стандартный метод закрытия главной формы:
Для записи файла, имя которого было введено или выбрано в стандартном диалоге сохранения, напишем обработчик пункта меню «Сохранить. «:
Здесь также видно, как обратиться к активному в настоящий момент дочернему окну или отследить ситуацию, при которой такого окна нет.
Пункт верхнего меню «Открыть. » будет выполнять довольно похожую работу — определять, есть ли активное дочернее окно, получать для него имя файла и выводить стандартный диалог открытия, после чего попытается сделать непосредственно загрузку из файла содержимого:
Удобство 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; рейтинг: 2399
Текстовый редактор с поддержкой макросов
Как известно, одной из сильных сторон приложений MS Office и OpenOffice является поддержка макросов. То есть в приложения можно добавлять свой ограниченный функционал в виде кода на определенном языке, который выполняется в приложении. Нечто похожее можно совершить и с нашими NET-приложениями. Благодаря классам CodeCompiler и CSharpCodeProvider мы можем компилировать приложения на лету и посредством некоторых логических действий связывать их с нашими приложениями
Создадим простейший текстовый редактор. И добавим в него поддержку макросов. Графически наш текстовый редактор будет состоять из компонента RichTextBox и меню, в котором будет два пункта — File и Macros. В пункте меню File будут подпункты Open, Save и Exit, с помощью которых мы будем сохранять и загружать файлы. А в пункте Macros будут два подпункта — Run Macro и Add Accembly. Run Macro будет запускать макрос на выполнение, а пункт Add Accembly будет добавлять в макрос ссылку на сборку (как это собственно мы делаем с проектом в Visual Studio). Код приложения будет выглядеть следующим образом:
Чтобы создать макрос, наберите код макроса в текстовом поле или в любом другом текстовом редакторе. Программа макроса идентична любой другой программе на C# за исключением следующий моментов: После секции импортированных пространств имен идет основной класс программы. Он должен носить имя Program, главный метод которого должен носить имя Main и принимать единственный параметр — RichTextBox. Обратите внимание на строчку Type t = (Type)obj.GetType().InvokeMember(«Main», BindingFlags.InvokeMethod, null, obj, args); . Здесь Main — это и есть вызываемый метод в классе, который был скомпилирован в объект obj . Причем так как c# — язык регистрозависимый, то название метода тут и в макросе должно совпадать по регистру.
Теперь создадим макрос, где мы попробуем отследить количество слов «string» и «new» в этом же макросе. Конечно, необязательно передавать в качестве параметра RichTextBox, это мы делаем для того, чтобы обеспечить связь с нашим приложением, набор же параметров может быть любой: