如何从RichTextBox中选择文本然后为其着色?

问题描述 投票:7回答:6

我想创建一个简单的编辑器,如Notepad++,功能简单......我需要在富文本框区域中为特定单词着色。我怎样才能做到这一点?

例如:当用户写下这些单词时,我想将它们着色为蓝色。这些词是:forwhileiftry等。

如何使richtextbox选择特定单词然后为其着色?并且,如果我想在//之后发表评论并为所有内容着色,那么在richtextbox中如何完成?

如何在文本框中对行进行编号,所以现在我可以在编辑器中编码时使用行号?

c#
6个回答
21
投票

这里有一些代码可以构建,以实现您想要的功能。

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文章Enabling syntax highlighting in a RichTextBox展示了如何在RichTextBox中使用RegEx来执行语法突出显示。具体来说,请查看SyntaxRichtTextBox.cs的实现。


4
投票

通常,您必须在RichTextBox中进行选择。您可以使用Find方法或使用SelectionStartSelectionLength属性来操纵当前选择。然后,您可以使用SelectionXXX属性更改所选文本的属性。例如,SelectionColor将设置当前选择的颜色等。因此,您必须在richtextbox中解析文本,然后选择部分文本并根据您的要求更改其属性。

使用RichTextBox编写好的文本编辑器可能非常麻烦。你应该使用一些像Scintilla这样的库。看看ScintillaNet,一个超过Scintilla的.NET包装器。


2
投票

你知道Notepad ++使用Scintilla吗?

你实际上没有必要通过麻烦来重新发明轮子,因为有一个名为.NET的scintilla的ScintillaNET端口你可以自由地嵌入你的应用程序作为源代码编辑器:)

但要回答您的问题,您需要了解的部分很少

  1. 寻找颜色
  2. 什么时候着色
  3. 如何着色
  4. 对于第一部分,可能有不同的方法,但我认为使用regular expressions将是一个不错的选择。对不起,但我不太了解正则表达式,所以在这种情况下我无法帮助你。
  5. 何时着色非常重要,如果你做错了,你的应用程序将遭受严重的性能损失。我建议你参考我们自己的Stack Overflow成员Cheeso完成的XPath Visualizer。看一下如何完成语法着色的来源。但如果你是ScintillaNET,一切都会得到照顾。无论如何,我似乎无法找到这个文档,他清楚地显示了文本的着色是如何完成的。如果我找到它,我肯定会在这里发布。
  6. 我认为第三个问题是VinayC所涵盖的。但基本上你使用SelectionColorSelectionStart

0
投票

这是一个关于基本richtextbox语法高亮的good link on c-sharpcorner.com 网站。我假设您和任何访问此页面的人遇到类似问题都希望为了学习目的而这样做。但是,如果任何人想要为某些商业级IDE制作它,那么它必须使用scintilla或类似的。另一种方法是直接change the RTF of the richtextbox。在codeproject.com中查看有很多类似于这个问题的文章。


0
投票

我有一些问题,这是我的解决方案,打败我为什么必须这样做,但它的工作原理:

            // 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
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.