Перейти к содержимому

Как создать текстовый редактор

  • автор:

Создание пользовательских редакторов и конструкторов

Область применения:yesVisual Studio Visual Studio для Mac noVisual Studio Code no

Интегрированная среда разработки Visual Studio может размещать различные типы редактора:

  • Редактор ядра Visual Studio
  • Пользовательские редакторы
  • Внешние редакторы
  • Конструкторы

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

Типы редактора

Сведения о редакторе ядра Visual Studio см. в разделе «Расширение редактора и языковых служб».

Пользовательские редакторы

Пользовательский редактор — это тот, который предназначен для работы в специализированных обстоятельствах. Например, можно создать редактор, функция которого заключается в чтении и записи данных в определенный репозиторий, например на сервере Microsoft Exchange. Выберите пользовательский редактор, если вы хотите, чтобы редактор работал только с типом проекта или если требуется редактор с несколькими определенными командами. Обратите внимание, что пользователи не смогут использовать пользовательский редактор для редактирования стандартных проектов Visual Studio.

Настраиваемый редактор может использовать фабрику редактора и добавлять сведения о редакторе в реестр. Однако тип проекта, связанный с пользовательским редактором, может создать экземпляр пользовательского редактора другими способами.

Настраиваемый редактор может использовать активацию на месте или упрощенное внедрение для реализации представления.

Внешние редакторы

Внешние редакторы — это редакторы, которые не интегрированы в Visual Studio, такие как Microsoft Word, Блокнот или Microsoft FrontPage. Например, вы можете вызвать такой редактор, если вы передаете в него текст из VSPackage. Внешние редакторы регистрируют себя и могут использоваться за пределами Visual Studio. При вызове внешнего редактора и его можно внедрить в окно узла, а затем он отображается в окне интегрированной среды разработки. В противном случае интегрированная среда разработки создает для него отдельное окно.

Метод IsDocumentInProject задает приоритет документа с помощью VSDOCUMENTPRIORITY перечисления. DP_External Если задано значение, файл можно открыть внешним редактором.

Решения по проектированию редактора

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

  • Сохраните ли приложение данные в файлах или нет? Если данные будут сохранены в файлах, они будут находиться в пользовательском или стандартном формате? Если вы используете стандартный формат файла, другие типы проектов в дополнение к проекту смогут открывать и читать и записывать в них данные. Однако если вы используете пользовательский формат файла, только тип проекта сможет открывать и читать и записывать данные в них. Если проект использует файлы, необходимо настроить стандартный редактор. Если проект не использует файлы, а использует элементы в базе данных или другом репозитории, необходимо создать пользовательский редактор.
  • Требуется ли редактору размещать элементы ActiveX? Если редактор размещает элементы ActiveX, то реализуйте редактор активации на месте, как описано в активации на месте. Если он не размещает элементы activeX, используйте упрощенный редактор внедрения или настройте редактор по умолчанию Visual Studio.
  • Будет ли ваш редактор поддерживать несколько представлений? Необходимо поддерживать несколько представлений, если вы хотите, чтобы представления редактора отображались одновременно с редактором по умолчанию. Если редактор должен поддерживать несколько представлений, то для редактора должны быть отдельные объекты данных документа и представления документов. Дополнительные сведения см. в разделе «Поддержка нескольких представлений документов». Если редактор поддерживает несколько представлений, планируется ли использовать реализацию текстового буфера редактора Visual Studio core (VsTextBuffer объект) для объекта данных документа? Это значит, что вы хотите поддерживать представление редактора параллельно с редактором ядра Visual Studio? Возможность сделать это является основой конструктора форм..
  • Если необходимо разместить внешний редактор, можно ли внедрить редактор в Visual Studio? Если его можно внедрить, необходимо создать окно узла для внешнего редактора, а затем вызвать IsDocumentInProject метод и задать VSDOCUMENTPRIORITY значение DP_External перечисления. Если редактор не может быть внедрен, интегрированная среда разработки автоматически создаст отдельное окно для него.

В этом разделе

Предоставление поддержки отмены конструкторам
Описывает, как предоставить поддержку отмены для конструкторов.

Цвет синтаксиса в пользовательских редакторах
Объясняет разницу между цветом синтаксиса в основном редакторе и в пользовательских редакторах.

Данные документа и представление документов в пользовательских редакторах
Описание реализации данных документа и представлений документов в пользовательских редакторах.

Связанный контент

  • Устаревшие интерфейсы в редакторе
    Объясняет, как получить доступ к основному редактору с помощью устаревшего API.
  • Разработка устаревшей языковой службы
    Объясняет, как реализовать языковую службу.
  • Расширение других частей Visual Studio
    Описание создания элементов пользовательского интерфейса, соответствующих остальной части Visual Studio.
  • IVsEditorFactory

Проект не для начинающих: пишем свой текстовый редактор с поиском и подсветкой синтаксиса на C

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

Предлагаем вашему вниманию серию англоязычных статей, опубликованную в блоге Джереми Рутена. В ней подробно разбирается процесс разработки собственного текстового редактора на языке C.

Проект занимает примерно тысячу строк кода и не использует никаких зависимостей. Для удобства и лучшего понимания весь процесс разбит на 184 шага. По прохождении каждого этапа вы сможете скомпилировать проект и увидеть все изменения. Исходный код каждого шага доступен на GitHub.

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

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

Итак, вот список статей:

  1. Настройка.
  2. Переход в «сырой» режим.
  3. «Сырой» ввод и вывод.
  4. Отображение текста.
  5. Редактор текста.
  6. Поиск.
  7. Подсветка синтаксиса.
  8. Примечания.

Если вам хочется написать ещё какой-нибудь проект самостоятельно, советуем обратить внимание на серию статей, посвящённую созданию ОС на ассемблере и Rust.

Как создать насыщенный текстовый редактор

Вашему вниманию представляется еще одна статья, вдохновленная тем, насколько крутым является элемент управления RichTextBox и как легко он позволяет создавать небольшой, но достаточно мощный текстовый редактор, наподобие Windows Wordpad! WPF создает все условия для легкой реализации приложения, но, несмотря на это, будет немного больше кода XAML и C#, чем обычно и это нормально. Мы пройдемся по каждому разделу в отдельности, а в конце, я покажу вам весь код целиком.

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

Для начала давайте посмотрим, к чему мы стремимся. Таков должен быть конечный результат:

Интерфейс

Интерфейс состоит из панели инструментов (ToolBar) с кнопками (Button) и полями со списком (ComboBox). Есть кнопки для загрузки и сохранения документа, кнопки для управления толщиной шрифта и его стилем написания, а также два поля со списком для управления семейством и размером шрифта.

Под панелью инструментов (ToolBar) находится элемент управления RichTextBox, в котором будут выполняться все текстовые изменения.

Команды

Первое, что вы можете заметить, это использование команд WPF, которые мы уже обсуждали ранее в этой статье. Мы используем элемент Open (Открыть) и Save (Сохранить) от класса ApplicationCommands, чтобы загрузить и сохранить документ, и мы используем ToggleBold, ToggleItalic и ToggleUnderline из класса EditingCommands для редактирования кнопок.

Преимущество использования команд очевидно, так как элемент управления RichTextBox уже реализует команды ToggleBold, ToggleItalic и ToggleUnderline. Это означает, что нам не нужно писать код, чтобы они работали. Просто подключите их к назначенной кнопке, и всё:

Таким образом, после подключения команд, мы активировали сочетание клавиш для быстрого редактирования текста. К примеру, Ctrl+B активирует жирный шрифт, Ctrl+I — курсив, а Ctrl+U, подчеркнутый текст.

Обратите внимание, что я использую ToggleButton вместо обычного элемента Button. Я хочу, чтобы кнопка была «проверяемой» — если выбрано выделение полужирным шрифтом, то кнопка будет активна (свойство IsChecked) у ToggleButton. К сожалению, WPF не приспособлен к такому, поэтому нам нужно написать немного кода для обновления состояний кнопки и Combobox. Более подробно мы поговорим об этом чуть позднее.

Команды Open и Save не могут быть обработаны автоматически, поэтому нам придется сделать это, как обычно, с привязкой CommandBinding для окна, а затем обработчиком событий в коде:

Чуть позднее я покажу реализацию этих команд.

Стиль и размер шрифта

Для того, чтобы изменить шрифт и его размер, у нас есть несколько полей со списком (ComboBox). Они заполняются системными шрифтами, а также выбором возможных размеров, например:

public RichTextEditorSample() < InitializeComponent(); cmbFontFamily.ItemsSource = Fonts.SystemFontFamilies.OrderBy(f =>f.Source); cmbFontSize.ItemsSource = new List() < 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72 >; >

Благодаря тому, что WPF включает в себя простое создание списка возможных шрифтов, с помощью свойства SystemFontFamilies, мы может с лёгкостью реализовать это. Поскольку список размеров является скорее рекомендацией, то мы делаем этот элемент управления ComboBox редактируемым, чтобы пользователь мог ввести желаемый размер самостоятельно:

Также это означает, что мы будем обрабатывать изменения по-разному. Для изменения шрифта в ComboBox мы можем просто обрабатывать событие SelectionChanged, подключаясь к событию TextBoxBase.TextChanged, чтобы обработать, введенный пользователем размер шрифта и его стиль.

WPF обрабатывает команды Bold, Italic и Underline самостоятельно, но для стиля шрифта и его размера нам придется вручную изменить некоторые значения. К счастью, это довольно легко сделать, используя метод ApplyPropertyValue(). Вышеупомянутые обработчики событий выглядят следующим образом.

private void cmbFontFamily_SelectionChanged(object sender, SelectionChangedEventArgs e) < if(cmbFontFamily.SelectedItem != null) rtbEditor.Selection.ApplyPropertyValue(Inline.FontFamilyProperty, cmbFontFamily.SelectedItem); >private void cmbFontSize_TextChanged(object sender, TextChangedEventArgs e)

Тут нет ничего особенного. Мы просто передаем выбранное или введенное значение методу ApplyPropertyValue() вместе со свойством, которое мы хотим изменить.

Обновление состояния

Как упоминалось ранее, WPF обрабатывает команды Bold, Italic и Underline самостоятельно, но мы должны вручную обновить состояние этих кнопок, так как команды не могут это осуществить. Поэтому мы также должны обновить два поля со списком (ComboBox), чтобы отразить текущее шрифты и размеры.

Нам необходимо обновить состояние, как только курсор перемещается и/или изменяется выделение, и для этого событие SelectionChanged в RichTextBox идеально подходит. Таким образом мы получаем:

private void rtbEditor_SelectionChanged(object sender, RoutedEventArgs e)

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

Принцип работы довольно прост. Для кнопок мы используем метод GetPropertyValue(), чтобы получить текущее значение для текстового свойства, например FontWeight, а затем обновляем свойство IsChecked в зависимости от того, является ли возвращаемое значение таким же, как то, что мы хотим или нет.

Для полей со списком (ComboBox) мы делаем то же самое, но вместо установки свойства IsChecked мы задаем свойства SelectedItem или Text, с возвращаемыми значениями.

Загрузка и сохранение файла

При обработке команд Open и Save мы используем очень похожий код:

private void Open_Executed(object sender, ExecutedRoutedEventArgs e) < OpenFileDialog dlg = new OpenFileDialog(); dlg.Filter = "Rich Text Format (*.rtf)|*.rtf|All files (*.*)|*.*"; if(dlg.ShowDialog() == true) < FileStream fileStream = new FileStream(dlg.FileName, FileMode.Open); TextRange range = new TextRange(rtbEditor.Document.ContentStart, rtbEditor.Document.ContentEnd); range.Load(fileStream, DataFormats.Rtf); >> private void Save_Executed(object sender, ExecutedRoutedEventArgs e) < SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "Rich Text Format (*.rtf)|*.rtf|All files (*.*)|*.*"; if(dlg.ShowDialog() == true) < FileStream fileStream = new FileStream(dlg.FileName, FileMode.Create); TextRange range = new TextRange(rtbEditor.Document.ContentStart, rtbEditor.Document.ContentEnd); range.Save(fileStream, DataFormats.Rtf); >>

OpenFileDialog или SaveFileDialog используется для указания местоположения и имени файла, а затем текст загружается или сохраняется с помощью объекта TextRange, который мы получаем непосредственно из RichTextBox, в сочетании с FileStream, который обеспечивает доступ к физическому файлу. Файл загружается и сохраняется в формате RTF, но вы можете указать любой другой текстовый формат на выбор, к примеру обычный текст (txt).

Полный пример

Ниже представлен код всего приложения, первоначально на XAML, а затем на C#:

using System; using System.Linq; using System.Collections.Generic; using System.IO; using System.Windows; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using Microsoft.Win32; using System.Windows.Controls; namespace WpfTutorialSamples.Rich_text_controls < public partial class RichTextEditorSample : Window < public RichTextEditorSample() < InitializeComponent(); cmbFontFamily.ItemsSource = Fonts.SystemFontFamilies.OrderBy(f =>f.Source); cmbFontSize.ItemsSource = new List() < 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72 >; > private void rtbEditor_SelectionChanged(object sender, RoutedEventArgs e) < object temp = rtbEditor.Selection.GetPropertyValue(Inline.FontWeightProperty); btnBold.IsChecked = (temp != DependencyProperty.UnsetValue) && (temp.Equals(FontWeights.Bold)); temp = rtbEditor.Selection.GetPropertyValue(Inline.FontStyleProperty); btnItalic.IsChecked = (temp != DependencyProperty.UnsetValue) && (temp.Equals(FontStyles.Italic)); temp = rtbEditor.Selection.GetPropertyValue(Inline.TextDecorationsProperty); btnUnderline.IsChecked = (temp != DependencyProperty.UnsetValue) && (temp.Equals(TextDecorations.Underline)); temp = rtbEditor.Selection.GetPropertyValue(Inline.FontFamilyProperty); cmbFontFamily.SelectedItem = temp; temp = rtbEditor.Selection.GetPropertyValue(Inline.FontSizeProperty); cmbFontSize.Text = temp.ToString(); >private void Open_Executed(object sender, ExecutedRoutedEventArgs e) < OpenFileDialog dlg = new OpenFileDialog(); dlg.Filter = "Rich Text Format (*.rtf)|*.rtf|All files (*.*)|*.*"; if(dlg.ShowDialog() == true) < FileStream fileStream = new FileStream(dlg.FileName, FileMode.Open); TextRange range = new TextRange(rtbEditor.Document.ContentStart, rtbEditor.Document.ContentEnd); range.Load(fileStream, DataFormats.Rtf); >> private void Save_Executed(object sender, ExecutedRoutedEventArgs e) < SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "Rich Text Format (*.rtf)|*.rtf|All files (*.*)|*.*"; if(dlg.ShowDialog() == true) < FileStream fileStream = new FileStream(dlg.FileName, FileMode.Create); TextRange range = new TextRange(rtbEditor.Document.ContentStart, rtbEditor.Document.ContentEnd); range.Save(fileStream, DataFormats.Rtf); >> private void cmbFontFamily_SelectionChanged(object sender, SelectionChangedEventArgs e) < if(cmbFontFamily.SelectedItem != null) rtbEditor.Selection.ApplyPropertyValue(Inline.FontFamilyProperty, cmbFontFamily.SelectedItem); >private void cmbFontSize_TextChanged(object sender, TextChangedEventArgs e) < rtbEditor.Selection.ApplyPropertyValue(Inline.FontSizeProperty, cmbFontSize.Text); >> >

Ниже представлен скриншот, где мы выбрали текст. Обратите внимание, как элементы управления панели инструментов отражают состояние текущего выделения:

Итог

Как вы можете видеть, создать текстовый редактор в WPF очень просто, особенно из-за отличного элемента управления RichTextBox. Если вы хотите, вы можете легко расширить этот пример такими вещами, как выравнивание текста, выбор цвета, списки и даже таблицы.

Имейте в виду, что приведенный выше пример должен работать нормально, нет абсолютно никакой обработки исключений или какой-либо проверки кода. Существуют несколько мест, которые могут легко вызвать ошибки, например, размер шрифта в поле со списком (ComboBox) может вызвать ошибку, если ввести в него не числовое значение. Поэтому, если вы хотите доработать функциональность для дальнейшей работы с этим примером, то вы должны проверить его на ошибки.

This article has been fully translated into the following languages:

Is your preferred language not on the list? Click here to help us translate this article into your language!

Текстовый редактор C#

Доработаем этот проект по Вашим требованиям, напишите подробности нам в Телеграм

Текстовый редактор C#

Текстовый редактор C#

Текстовый редактор C#

Текстовый редактор C#

Текстовый редактор C#

Текстовый редактор C#

Текстовый редактор C#

Текстовый редактор C#

ОПИСАНИЕ

Текстовый редактор написанный на языке C#

  • Редактирование текста
  • Загрузка текста из файла
  • Сохранение текста в файл
  • Простенькая настройка интерфейса редактора
  • Добавление информации об авторе(вас) программы

Код прост и понятен даже новичку, программа безупречно справляется с поставленной ей задачей — быстрое редактирование текста

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

Задание

Написать программу, которая позволит редактировать текстовые файлы(как программа блокнот).

Фрагмент программного кода:

private void сохранитьToolStripMenuItem_Click(object sender, EventArgs e) < //устанавливаем фильтр тольно на файлы тхт saveFileDialog1.Filter = "Text files | *.txt"; //сохраняем наш текстовый файл после нажатия кнопки ок if (saveFileDialog1.ShowDialog() == DialogResult.OK) File.WriteAllText(saveFileDialog1.FileName, richTextBox1.Text); >private void выходToolStripMenuItem_Click(object sender, EventArgs e) < Application.Exit(); //выйти из программы >private void новыйФайлToolStripMenuItem_Click(object sender, EventArgs e) < richTextBox1.Clear();//создать новый файл >private void отменаToolStripMenuItem_Click(object sender, EventArgs e) < richTextBox1.Undo();//шаг назад >

Скриншот архива с проектом — последняя фотография над описанием

  • Автор работы: Mihail

Купить 800,00

Сразу после оплаты Вы сможете скачать работу и мы вышлем дополнительно файл с работой на электронную почту. Исходник программ Вы сможете отредактировать, как Вам нужно.

Комментарии
Комментарии (0)

Здесь еще никто не оставлял свои комментарии, будь первым!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *