Компонент SyntaxBox должен автоматически выявлять в своем тексте (свойство Text класса RichTextBox) ключевые слова и вставлять в текст разметки (свойство Rtf класса RichTextBox) специальные теги, которые имеют примерно такой вид: "\cf3 ". Конкретно этот тег означает, что надо взять из таблицы цветов (ColorTable) третий цвет и включить цветовую подсветку. Начиная с того места, где стоит тег и вплоть до следующего (задающего цвет) тега, текст будет иметь цвет, определенный 3-м цветом.
Таблица ColorTable должна присутствовать в заголовке RTF (начальной части текста разметки Rtf). Она имеет такой формат:
{\colortbl ;\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;}
В этой конкретной таблице определено три цвета: черный, белый и синий. Если вы хотите, чтобы RichTextBox (а, следовательно, и наш SyntaxBox) вывел в окно, такой текст:
C# keywords: abstract, as, base etc.
то (при наличии 3-х цветной таблицы ColorTable) нам надо сформировать такой фрагмент текста разметки:
\cf1 C# keywords: \cf3 abstract\cf1 , \cf3 as\cf1 , \cf3 base\cf1 etc.
Обратите внимание на чередование окрашивающих тегов. Пробелы после тегов, задающих цвет, убирать нельзя. Они ограничивают теги и поэтому важны. Аналогичным способом, стандартный формат RTF (Rich Text Format) позволяет управлять не только чередованием цвета, но и чередованием шрифтов (их именами и размерами).
Так как RTF является, хоть и простым, но незнакомым форматом, полезно провести опыт с целью поближе рассмотреть форматированный текст, который потребляется элементом RichTextBox.
¨ Добавьте в класс MainForm реакцию на нажатие кнопки Save и код, который сохраняет текст в формате RTF.
box.SaveFile (fileName, RichTextBoxStreamType.RichText);
¨ Возьмите цветной текст из редактора студии или из Word'а и восстановите его в окне RichTextBox'а.
¨ Сохраните этот текст в RTF-файле.
¨ Откройте файл в рамках студии с помощью текстового редактора. Используйте команду Open With, которая появится из выпадающего меню кнопки Open диалога Open.
¨ Рассмотрите текст и попытайтесь понять назначение тегов.
¨ В документации MSDN уясните принцип использования следующих свойств класса RichTextBox: SelectionStart, SelectionLength и SelectedText. Они играют очень важную роль в управлении текстом.
Для выявления в тексте RTF (элемента SyntaxBox) ключевых слов, а также комментариев, предлагаю создать вспомогательные структуры данных. Вы можете создать иерархию классов (так вначале поступил я):
Вы можете обойтись и более простыми структурами данных. (Напомню, что ValueType — базовый класс для всех value types, в том числе и для структур). С учебной точки зрения иерархия классов полезна, но, практика показала, что рассмотренное выше множество классов затратно и неэффективно в работе. Вы вольны в выборе средств (здесь есть, где проявить фантазию). После опробывания нескольких вариантов, я остановился на двух структурах, которые имеют такой вид.
public struct Keyword
{
public readonly string Word; // Ключевое слово
public readonly Color Color; // Цвет ключевого слова
public readonly bool UsePrompt; // Признак попадания в коллекцию подсказок автозаполнения
// Множество конструкторов, отличающихся набором параметров (создайте самостоятельно).
}
public struct Comment
{
public readonly string OpenTag; // Открывающий тег комментария
public readonly string CloseTag; // Замыкающий тег, если OpenTag - многострочный комментарий
public readonly Color Color; // Цвет текста комментария
// Множество конструкторов, отличающихся набором параметров (создайте самостоятельно).
}
Отметим некоторые особенности:
¨ Если поле СloseTag == null (не задано), то комментарий (OpenTag) действует до конца строки, например: //.
¨ Если СloseTag задан, то комментарий — многострочный, например такой: /*...*/, или такой: ". . .".
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.