Как создать текстовый редактор в visual studio
Создадим приложение SimpleNotepad, представляющее собой простейший текстовый редактор. Окно этого редактора, будет содержать: меню, инструментальную панель и строку состояния.
Отредактируйте имя формы, которая по умолчанию называется Form1 на SimpleNotepadForm.
В окне Solution Explorer переименуйте файл: form1.cs в SimpleNotepadForm.sc.
Создавая приложения, старайтесь называть пространства имен и классы так, чтобы из их названия было понятно назначение этих пространств имен и приложений.
Если Вам нужно создавать пространства имен, которые будут использоваться сторонними разработчиками, добавляйте к названию пространства имен какую-либо уникальную строку, например, название своей компании.
Замените стандартный значок (иконку), создаваемый системой Microsoft Visual Studio .NET каким-нибудь другим.
Измените размеры окна, принятые по умолчанию, т.к. в маленьком окне редактировать текст неудобно.
Добавление меню
Для того чтобы добавить меню в главное окно нашего приложения, перетащите из панели инструментов Toolbox значок меню с названием menuStrip. Как только Вы это сделаете, окно дизайнера форм примет вид, показанный на рисунке 1.1.
Рисунок 1.1 - Добавление меню
В нижней части этого окна появится значок программного компонента — меню menuStrip1. Кроме того, непосредственно под заголовком окна появится пустое пока меню, представленное полем с надписью Type Here (что можно перевести как «печатать здесь»).
Напечатайте в этом поле строку «Файл». В результате этого в окне нашего приложения появится меню Файл (рисунок 1.2).
Рисунок 1.2 - Создание меню Файл
По мере того как Вы будете вводить названия строк меню «Файл», поле ввода Type Here будет опускаться вниз. Таким способом Вы сможете ввести все необходимые строки данного меню.
Чтобы отредактировать строку меню, щелкните ее правой клавишей мыши. На экране появится контекстное меню, показанное на рисунке 1.3.
Рисунок 1.3 - Контекстное меню
С помощью строки Insert Вы можете вставить новую строку меню между уже существующих строк, строка Separator предназначена для вставки разделительной линии между строками меню.
Если же Вам нужно изменить введенные названия строк и меню, это можно сделать по месту, выбрав нужную строку мышью.
Создайте меню «Файл» как показано на рисунке 1.4.
Рисунок 1.4 - Меню «Файл»
Далее создайте меню «Правка» (рисунок 1.5).
Рисунок 1.5 - Меню «Правка»
Меню «Формат» (рисунок 1.6) состоит только из одной строки «Шрифт», с помощью которой пользователь сможет изменить шрифт текста.
Рисунок 1.6 - Меню «Формат»
И, наконец, последнее меню нашего приложения, это меню «Справка» (рисунок 1.7).
Рисунок 1.7 - Меню «Справка»
В этом меню мы предусмотрели только одну строку – «О программе».
Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.
в интегрированной среде разработки (IDE) Visual Studio могут размещаться различные типы редакторов:
редактор Visual Studio core
Следующие сведения помогут выбрать необходимый тип редактора.
Типы редакторов
дополнительные сведения о редакторе Visual Studio core см. в разделе расширение возможностей редактора и языковых служб.
Пользовательские редакторы
Пользовательский редактор — это тот, который предназначен для работы в специализированных обстоятельствах. например, можно создать редактор, функция которого предназначена для чтения и записи данных в определенном репозитории, например на сервере Microsoft Exchange. Выберите пользовательский редактор, если требуется редактор, работающий только с типом проекта, или если требуется редактор, содержащий только несколько конкретных команд. Однако обратите внимание, что пользователи не смогут использовать пользовательский редактор для изменения стандартных Visual Studio проектов.
Пользовательский редактор может использовать фабрику редактора и добавлять сведения о редакторе в реестр. Однако тип проекта, связанный с пользовательским редактором, может создавать экземпляр пользовательского редактора другими способами.
Пользовательский редактор может использовать встроенную активацию или упрощенное внедрение для реализации представления.
Внешние редакторы
внешние редакторы — это редакторы, которые не интегрированы в Visual Studio, такие как Microsoft Word, Блокнот или Microsoft FrontPage. Такой редактор можно вызывать, например, при передаче текста в него из VSPackage. Внешние редакторы регистрируют себя и могут использоваться вне Visual Studio. При вызове внешнего редактора его можно внедрить в главное окно, после чего оно появится в окне в интегрированной среде разработки. В противном случае интегрированная среда разработки создает для него отдельное окно.
IsDocumentInProjectМетод задает приоритет документа с помощью VSDOCUMENTPRIORITY перечисления. Если DP_External указано значение, файл может быть открыт внешним редактором.
Решения по проектированию редактора
Следующие вопросы по проектированию помогут выбрать тип редактора, который лучше всего подходит для приложения:
Будет ли приложение сохранять данные в файлах или нет? Если данные будут сохранены в файлах, будет ли они работать в пользовательском или стандартном формате?
Если используется стандартный формат файла, другие типы проектов в дополнение к проекту смогут открывать и считывать и записывать данные. Однако при использовании пользовательского формата файла только тип проекта сможет открывать и считывать и записывать данные.
Если в проекте используются файлы, следует настроить стандартный редактор. Если в проекте не используются файлы, а используются элементы в базе данных или другом репозитории, следует создать пользовательский редактор.
нужен ли редактор для размещения элементов управления ActiveX?
если в редакторе размещается ActiveX элементов управления, то реализуйте редактор активации на месте, как описано в этой активации. если на нем не размещены элементы управления ActiveX, используйте упрощенный редактор внедрения или настройте Visual Studio редактор по умолчанию.
Будет ли редактор поддерживать несколько представлений? Если вы хотите, чтобы представления редактора были видимыми одновременно с редактором по умолчанию, необходимо поддерживать несколько представлений.
Если редактор должен поддерживать несколько представлений, объекты данных документа и представления документов для редактора должны быть отдельными объектами. Дополнительные сведения см. в разделе Поддержка нескольких представлений документов.
Если редактор поддерживает несколько представлений, вы планируете использовать Visual Studio реализацию текстового буфера ( VsTextBuffer объекта) основного редактора для объекта данных документа? Это значит, что вы хотите поддерживать представление редактора параллельно с Visual Studio основным редактором? Эта возможность доступна в конструкторе форм.
Если необходимо разместить внешний редактор, можно ли внедрить редактор в Visual Studio ?
Если его можно внедрить, следует создать главное окно для внешнего редактора, а затем вызвать IsDocumentInProject метод и установить VSDOCUMENTPRIORITY для перечисления значение DP_External . Если редактор не может быть внедрен, интегрированная среда разработки автоматически создаст для нее отдельное окно.
В этом разделе
Предоставление поддержки отмены в конструкторах
Объясняет, как обеспечить поддержку отмены для конструкторов.
Выделение синтаксиса в пользовательских редакторах
Объясняет разницу между цветовым выделением синтаксиса в основном редакторе и в пользовательских редакторах.
Данные документа и представление документа в пользовательских редакторах
Объясняет, как реализовать данные документа и представления документов в пользовательских редакторах.
Связанные разделы
Устаревшие интерфейсы в редакторе
Объясняется, как получить доступ к основному редактору с помощью устаревшего API.
Расширение других частей Visual Studio
Объясняет, как создавать элементы пользовательского интерфейса, соответствующие остальным элементам Visual Studio .
БлогNot. Visual C++: пишем простой многодокументный редактор текста RTF
Visual C++: пишем простой многодокументный редактор текста RTF
То есть, MDI-приложение. Пример вот отсюда как-то мне не очень нравится, потому что написан левой ногой и не использует стандартные возможности по управлению дочерними окнами. Этот пример тоже, в общем, пишется левой ногой и прямо сейчас, но постараемся сделать хотя бы классическую картинку "много окон документов внутри главного окна приложения".
В 2015-й (или выше) Visual Studio создадим приложение Windows Forms на C++.
На форму приложения перетащим главное меню MenuStrip и стандартные диалоги для работы с файлами OpenFileDialog, SaveFileDialog. У диалогов достаточно настроить свойство Filter на нужный нам тип файлов, с которым будем работать, выберем " Файлы RTF|*.rtf ".
В меню предусмотрим несколько пунктов, которые покажут разные возможности работы с файлами, текстом в дочерних окнах и самими окнами:
простое меню родительской формы MDI-приложения
Также не забудем установить родительской форме свойство IsMdiContainer = true.
Затем добавим к приложению ещё одну форму (меню Проект - Добавить новый элемент - Viual C++ - UI - Форма Windows Forms). У меня она назвалась MyForm1 , пусть так и остаётся.
Настроим новую форму, перетащив на неё какое-нибудь многострочное текстовое поле, например, стандартный RichTextBox и установив у него в окне Свойств размер во всю область дочернего окна (свойство Dock = Fill).
В дочернее окно добавим также контекстное меню contextMenuStrip1, которое будет вызываться правой кнопкой мыши. Предусмотрим там 4 пункта (Вырезать, Копировать, Копировать все, Вставить). Это позволит приложению обмениваться кусками текста между окнами через системный Буфер Обмена. Сначала все пункты отключены (свойство Enabled = false).
Это меню укажем в свойстве ContextMenuStrip компоненты richTextBox1.
Добавим в дочернее окно его собственный SaveFileDialog, чтобы можно было выбрать имя файла для сохранения, если мы закрываем дочернее окно с изменённым текстом. На диалог поставим такой же фильтр, как у родительской формы. Вообще, конечно, лучше было бы не плодить компоненты, а воспользоваться неким отдельным классом-наследником SaveFileDialog, который мы могли написать.
форма дочернего окна
Теперь дочернюю форму мы пропишем вверху файла родительской формы MyForm.h :
Мы уже умеем создавать обработчики событий двойным кликом из списка событий в окне "Свойства", так что приведу только "внутренности" функций-обработчиков стандартных событий.
По выбору пункта меню "Создать" просто вызовем только что написанный метод:
Пункт "Выход" запрограммировать тоже просто, будем вызывать стандартный метод закрытия главной формы:
Для записи файла, имя которого было введено или выбрано в стандартном диалоге сохранения, напишем обработчик пункта меню "Сохранить. ":
Здесь также видно, как обратиться к активному в настоящий момент дочернему окну или отследить ситуацию, при которой такого окна нет.
Пункт верхнего меню "Открыть. " будет выполнять довольно похожую работу - определять, есть ли активное дочернее окно, получать для него имя файла и выводить стандартный диалог открытия, после чего попытается сделать непосредственно загрузку из файла содержимого:
Удобство MDI-приложения в том, что при закрытии главного окна обработчки события FormClosing дочерних окон будут вызваны автоматически, так что каждому экземпляру дочернего окна достаточно будет позаботиться о сохранности только своего текста из своего RichTextBox.
При этом, отказ от сохранения какого-либо из текстов в дочерних окнах не будет означать отказа от закрытия приложения.
Ниже приведён обработчик события FormClosing главной формы. Комментарием показано, как можно было бы обойти в цикле все дочерние окна.
Если последний оператор закомментировать, нажатие кнопки "Отмена" в ответ на предложение сохранить любой из несохранённых файлов будет отменять и закрытие родительского окна.
Выбор пункта меню "Дата и время" вставит в конец текста активного окна текущие дату и время, примерно как в стандартном Блокнотике Windows (только там - в место расположения курсора). Эта функция добавлена просто для иллюстрации:
Наконец, пункт "Каскад" уложит каскадом имеющиеся дочерние окна, по аналогии легко сделать остальные стандартные "Укладки":
Во-первых, позаботимся о том, чтобы пункты контекстного меню были доступны только тогда, когда они нужны.
Метод checkForClipboardFormat будет проверять, что находится в Буфере Обмена и разрешать вставлять только RTF:
Мы вызовем его в обрабтчике события загрузки (Load) дочерней формы:
Также напишем для richTextBox1 обработчики событий SelectionChanged (изменение выбора текста)
и TextChanged (изменение самого текста), имеющие схожие цели.
Пункт меню "Вырезать" будет программировать просто:
"Копировать все" тоже:
А вот обработчик пункта "Вставить" будет дополнительно проверять, есть ли в системном Буфере данные подходящего формата и не выделено ли что-то в тексте из richTextBox1:
Перед закрытием формы в обработчике события FormClosing нам придётся запросить у пользователя сохранение файла, если оно требуется, и дать ему возможность сохранить изменения, отказаться от сохранения или отменить закрытие окна:
Проект собирается. Теперь можно добавить в главное окно, например, панель инструментов с кнопками для изменения цвета, размера шрифта и т.п., что обычно бывает в текстовых редакторах.
В простейшем случае, добавив и настроив toolStripContainer , а на нём кнопку " B " (выделение жирным), мы можем написать примерно такой код для переключения шрифта контрола активного окна между жирным и обычным (обработка щелчка по кнопке):
В этой статье мы будем использовать множество элементов управления и методов, которые мы использовали в других руководствах, поэтому объяснения не будут чересчур подробными. В случае, если вам нужно освежить некоторые знания, то вы всегда можете вернуться к подробным описаниям.
Для начала давайте посмотрим, к чему мы стремимся. Таков должен быть конечный результат:
Интерфейс
Интерфейс состоит из панели инструментов (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). Они заполняются системными шрифтами, а также выбором возможных размеров, например:
Благодаря тому, что WPF включает в себя простое создание списка возможных шрифтов, с помощью свойства SystemFontFamilies, мы может с лёгкостью реализовать это. Поскольку список размеров является скорее рекомендацией, то мы делаем этот элемент управления ComboBox редактируемым, чтобы пользователь мог ввести желаемый размер самостоятельно:
Также это означает, что мы будем обрабатывать изменения по-разному. Для изменения шрифта в ComboBox мы можем просто обрабатывать событие SelectionChanged, подключаясь к событию TextBoxBase.TextChanged, чтобы обработать, введенный пользователем размер шрифта и его стиль.
WPF обрабатывает команды Bold, Italic и Underline самостоятельно, но для стиля шрифта и его размера нам придется вручную изменить некоторые значения. К счастью, это довольно легко сделать, используя метод ApplyPropertyValue(). Вышеупомянутые обработчики событий выглядят следующим образом.
Тут нет ничего особенного. Мы просто передаем выбранное или введенное значение методу ApplyPropertyValue() вместе со свойством, которое мы хотим изменить.
Обновление состояния
Как упоминалось ранее, WPF обрабатывает команды Bold, Italic и Underline самостоятельно, но мы должны вручную обновить состояние этих кнопок, так как команды не могут это осуществить. Поэтому мы также должны обновить два поля со списком (ComboBox), чтобы отразить текущее шрифты и размеры.
Нам необходимо обновить состояние, как только курсор перемещается и/или изменяется выделение, и для этого событие SelectionChanged в RichTextBox идеально подходит. Таким образом мы получаем:
По факту, совсем немного строк, но самую главную работу совершают лишь пара из них. Нам необходимо слегка изменить их, чтобы обновить каждую из трёх кнопок и два поля со списком.
Принцип работы довольно прост. Для кнопок мы используем метод GetPropertyValue(), чтобы получить текущее значение для текстового свойства, например FontWeight, а затем обновляем свойство IsChecked в зависимости от того, является ли возвращаемое значение таким же, как то, что мы хотим или нет.
Для полей со списком (ComboBox) мы делаем то же самое, но вместо установки свойства IsChecked мы задаем свойства SelectedItem или Text, с возвращаемыми значениями.
Загрузка и сохранение файла
При обработке команд Open и Save мы используем очень похожий код:
OpenFileDialog или SaveFileDialog используется для указания местоположения и имени файла, а затем текст загружается или сохраняется с помощью объекта TextRange, который мы получаем непосредственно из RichTextBox, в сочетании с FileStream, который обеспечивает доступ к физическому файлу. Файл загружается и сохраняется в формате RTF, но вы можете указать любой другой текстовый формат на выбор, к примеру обычный текст (txt).
Полный пример
Ниже представлен скриншот, где мы выбрали текст. Обратите внимание, как элементы управления панели инструментов отражают состояние текущего выделения:
Как вы можете видеть, создать текстовый редактор в WPF очень просто, особенно из-за отличного элемента управления RichTextBox. Если вы хотите, вы можете легко расширить этот пример такими вещами, как выравнивание текста, выбор цвета, списки и даже таблицы.
Имейте в виду, что приведенный выше пример должен работать нормально, нет абсолютно никакой обработки исключений или какой-либо проверки кода. Существуют несколько мест, которые могут легко вызвать ошибки, например, размер шрифта в поле со списком (ComboBox) может вызвать ошибку, если ввести в него не числовое значение. Поэтому, если вы хотите доработать функциональность для дальнейшей работы с этим примером, то вы должны проверить его на ошибки.
Читайте также:
- Лучшая программа для обработки фото на айфон платные
- Как перелинковать файл в after effects
- 1с основная таблица динамического списка задана неверно не задан ни текст запроса
- Описать способ ввода повторяющихся символьных данных в эксель
- Извините только один пользователь может единовременно запустить программное обеспечение и драйверы