@Avery007

Подсветка синтаксиса в RichTextBox

Пишу для себя редактор PHP, столкнулся с проблемой подсветки синтаксиса. 2 дня искал решения в интернете, но все либо не работают как надо, либо не подходят. Напишите пожалуйста кусочек кода, чтоб подсвечивалось хотя бы слово class. Дальше сам допилю для себе. Заранее огромное спасибо.
  • Вопрос задан
  • 10424 просмотра
Решения вопроса 2
@noname_d
Насколько я знаю, это возможно сделать только при помощи свойства SelectionColor. Т.е. сперва нужно установить Selection на нужный участок текста, а затем задать цвет. Примерно так:

private void richTextBox1_TextChanged(object sender, EventArgs e)
{
    var currentSelStart = richTextBox1.SelectionStart;
    var currentSelLength = richTextBox1.SelectionLength;

    richTextBox1.SelectAll();
    richTextBox1.SelectionColor = SystemColors.WindowText;

    var matches = Regex.Matches(richTextBox1.Text, @"\bclass\b");
    foreach (var match in matches.Cast<Match>())
    {
        richTextBox1.Select(match.Index, match.Length);
        richTextBox1.SelectionColor = Color.Blue;
    }

    richTextBox1.Select(currentSelStart, currentSelLength);
    richTextBox1.SelectionColor = SystemColors.WindowText;
}

Разумеется, заново раскрашивать весь текст при каждом изменении неправильно. Это нужно делать более оптимальным образом. Кроме того, желательно отключить перерисовку на время раскрашивания, иначе возможны нежелательные моргания при большом размере текста. В примере этого нет, но тут вроде есть решение.
Ответ написан
Комментировать
@Porohkun
Вообще, если вам надо подсвечивать не свое что-то, а какой-то конкретный код, есть готовые неплохие решения, например, ICSharpCode TextEditor.

Если не ошибаюсь, он же и использован в notepad++. Хотя не уверен, так как слышал это краем уха, а проверять лень.))
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@Avery007 Автор вопроса
Спасибо вам огромное. Но если раскрашивать весь текст при каждом изменении неправильно, то как тогда действовать? К примеру как реализовано это в notepad++?
Ответ написан
Комментировать
@noname_d
Не знаю, как это реализовано в Notepad++, но разумнее всего обновлять подсветку только для тех строк, которые были изменены. Хотя в этом случае есть 2 трудности: во-первых, необходимо как-то отслеживать изменения и, во-вторых, обрабатывать случай, когда подсвечиваемая лексема располагается на нескольких строках (например, многие языки позволяют разбивать строки, заключенные в кавычки; справедливо ли это для PHP - не помню).
Ответ написан
Комментировать
@Avery007 Автор вопроса
В принципе есть такая идея:
В TextChanged отслеживать где находился курсор, и в сверять что изменилось с предыдущим вариантом, и раскрашивать изменённый текст, а при копировании все перекрашивать. Кстати, не знаете как отследить момент, когда в RichTextBox копируют текст?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы