Как выделить текст в RichTextBox, а затем раскрасить его? - PullRequest
7 голосов
/ 14 сентября 2010

Я хочу создать простой редактор, такой как Notepad ++ с простой функциональностью ... Мне нужно раскрасить определенное слово в поле расширенного текстового поля.Как я могу это сделать?

Например: когда пользователь пишет эти слова, я хочу покрасить их в синий цвет.Это следующие слова: for, while, if, try и т. Д.

Как сделать richtextbox, чтобы выбрать конкретное слово и затем покрасить его?И, если я хочу сделать комментарий и раскрасить все после //, как это делается в richtextbox?

Как мне нумеровать строку в текстовом поле, чтобы я мог теперь узнать номер строкикогда я пишу код в моем редакторе?

Ответы [ 6 ]

21 голосов
/ 14 сентября 2010

Вот некоторый код, который вы можете построить для достижения желаемой функциональности.

private void ColourRrbText(RichTextBox rtb)
{
    Regex regExp = new Regex("\b(For|Next|If|Then)\b");

    foreach (Match match in regExp.Matches(rtb.Text))
    {
        rtb.Select(match.Index, match.Length);
        rtb.SelectionColor = Color.Blue;
    }
}

Статья CodeProject Включение подсветки синтаксиса в RichTextBox показывает, как использовать RegEx вRichTextBox для подсветки синтаксиса.В частности, посмотрите на SyntaxRichtTextBox.cs для реализации.

4 голосов
/ 14 сентября 2010

В общем, вы должны работать над выделением в RichTextBox.Вы можете управлять текущим выбором, используя метод Find или используя свойства SelectionStart и SelectionLength.Затем вы можете изменить свойства выделенного текста, используя SelectionXXX свойства.Например, SelectionColor установит цвет текущего выделения и т. Д. Таким образом, вы должны проанализировать текст в richtextbox, а затем выбрать часть текста и изменить их свойства в соответствии с вашими требованиями.использование RichTextBox может быть довольно громоздким.Для этого вам следует использовать некоторую библиотеку, например Scintilla .Взгляните на ScintillaNet , оболочку .NET поверх Scintilla.

2 голосов
/ 14 сентября 2010

Знаете ли вы, что Notepad ++ использует Scintilla ?

На самом деле вам не нужно заново изобретать колесо, выполнив все проблемы, так как есть порт .NET Scintilla с именем ScintillaNET , который вы можете свободно встраивать в свое приложение как редактор исходного кода:)

Но чтобы ответить на ваш вопрос, есть несколько частей, которые вам нужно понять

  1. В поисках чего покрасить
  2. Когда раскрашивать
  3. Как покрасить

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

  5. Когда цвета очень важны, и если вы сделаете это неправильно, ваше приложение будет подвергнуто серьезному снижению производительности. Я предлагаю вам обратиться к XPath Visualizer , который был сделан нашим собственным участником Stack Overflow, Cheeso. Посмотрите на источник о том, как была сделана раскраска синтаксиса. Но если вы ScintillaNET, обо всем позаботятся. Во всяком случае, я действительно не могу найти эту документацию, где он ясно показал, как была сделана раскраска текста. Я бы определенно разместил его здесь, если найду.

  6. Третий вопрос, я думаю, покрыт VinayC. Но в основном вы используете SelectionColor вместе с SelectionStart .

0 голосов
/ 05 марта 2019

реализация Vb.net

Imports System.Text.RegularExpressions

Private Sub formatString()
  Dim rg =New Regex("\b(for|while|if|try)\b")
  Dim m As Match

 For Each m In rg.Matches(RichTextBox1.Text)
   RichTextBox1.Select(m.Index,m.Length)
   RichTextBox1.SelectionColor=Color.Green 
 Next

End Sub
0 голосов
/ 23 ноября 2015

У меня были некоторые проблемы с этим, и вот мое решение, обгоняет меня, почему это должно быть сделано так, но это работает:

            // position on end of control...
            richTextBox.UpdateLayout();
            richTextBox.ScrollToEnd();
            richTextBox.UpdateLayout();

            // ...then select text and it will be position on top of control.
            richTextBox.Focus();
            richTextBox.Selection.Select(foundRange.Start, foundRange.End);
            richTextBox.BringIntoView();
0 голосов
/ 21 февраля 2013

Вот хорошая ссылка на веб-сайте c-sharpcorner.com по основной подсветке синтаксиса richtextbox.Я предполагаю, что вы и любой, кто посещает эту страницу по аналогичной проблеме, хотят сделать это в целях обучения.Но если кто-то захочет сделать это для какого-то IDE коммерческого уровня, то он должен использовать scintilla или что-то подобное.Другой подход для этого заключается в прямом изменении RTF richtextbox .Посмотрите на codeproject.com есть много статей, похожих на эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...