【问题标题】:VB.net richtextbox multiple colors to specified wordsVB.net richtextbox 多种颜色到指定字
【发布时间】:2016-01-27 06:49:50
【问题描述】:

所以我的程序将一个文本文件读入一个富文本框。例如,我想要所有单词"echo" "pause" "setlocal" to be blue"%" to be orange"、"rem" "::" to be green 等等。很多不同的单词得到不同的颜色。是的,这个想法是让richtextbox 像notepad++ 那样读取.bat 文件做颜色-明智的。

我已经知道如何为一个单词设置颜色

Private Sub PreviewRTB_TextChanged(sender As Object, e As EventArgs) Handles PreviewRTB.TextChanged
    PreviewRTB.Multiline = True
    PreviewRTB.ScrollBars = ScrollBars.Vertical

    'Set Colors
    Dim index As Integer = 0
    Dim c_blue As String = "Echo"

    While index <> -1
        index = PreviewRTB.Find(c_blue, index, RichTextBoxFinds.WholeWord)
        If index <> -1 Then
            PreviewRTB.SelectionStart = index
            PreviewRTB.SelectionLength = c_blue.Length
            PreviewRTB.SelectionColor = Color.Blue
            index += c_blue.Length
        End If
    End While

但是我在哪里设置 dim c_blue 下的其余单词?我尝试了Dim c_blue As String = "Echo" &amp; "setlocal" &amp; "pause" 也尝试在两者之间使用+,但它不起作用。以及如何为其他单词添加另一种颜色?谢谢!

【问题讨论】:

  • 除非你真的想自己做这部分,否则你最好使用专门为此而构建的东西——比如ScintillaNET

标签: .net vb.net text-coloring


【解决方案1】:

对于简单的着色,只要文本不太长,这样就可以了:

Dim KeyWords As List(Of String) = New List(Of String)(New String() {"this", "word", "color"})
Dim KeyWordsColors As List(Of Color) = New List(Of Color)(New Color() {Color.Blue, Color.Red, Color.Green})
Private Sub PreviewRTB_TextChanged(sender As Object, e As EventArgs) Handles PreviewRTB.TextChanged
    Dim words As IEnumerable(Of String) = PreviewRTB.Text.Split(New Char() {" "c, ".", ",", "?", "!"})
    Dim index As Integer = 0
    Dim rtb As RichTextBox = sender 'to give normal color according to the base fore color
    For Each word As String In words
        'If the list contains the word, then color it specially. Else, color it normally
        'Edit: Trim() is added such that it may guarantee the empty space after word does not cause error
        coloringRTB(sender, index, word.Length, If(KeyWords.Contains(word.ToLower().Trim()), KeyWordsColors(KeyWords.IndexOf(word.ToLower().Trim())), rtb.ForeColor))
        index = index + word.Length + 1 '1 is for the whitespace, though Trimmed, original word.Length is still used to advance
    Next
End Sub

Private Sub coloringRTB(rtb As RichTextBox, index As Integer, length As Integer, color As Color)
    Dim selectionStartSave As Integer = rtb.SelectionStart 'to return this back to its original position
    rtb.SelectionStart = index
    rtb.SelectionLength = length
    rtb.SelectionColor = color
    rtb.SelectionLength = 0
    rtb.SelectionStart = selectionStartSave
    rtb.SelectionColor = rtb.ForeColor 'return back to the original color
End Sub

这里的想法很简单:

  1. 列出要着色的单词
  2. 列出这些单词的颜色
  3. 当实时出价文本改变时,用String.Split逐字解析(注意“实时出价文本改变”这个条件可以随意改变)
  4. 检查解析的单词。如果找到了,就开始给那个词上色。如果没有,请使用默认颜色对其进行着色
  5. 转到下一个单词,直到文本阅读完成。
  6. 不要忘记根据word.Length+1为空格增加检查器的当前索引

结果会是这样的:

下一个(2)

下一个(3)

下一个 (4)

下一个 (5)

注意:如果文本太长,请考虑创建一个计时器(或一些 其他模块)定期检查您的 RTB 而不是检查 文本更改时的文本。因此,当文本发生变化时。你重置了 计时器。当文本有时没有改变时,你开始 实现所有文本的着色逻辑。这样,您就可以使 word-color checker 的工作量明显减少。

【讨论】:

  • 感谢您的宝贵意见。很快就试一试。
  • @MadsTheMan 是的 :) 对于简单的文本,就可以了。如果你想检查像 C# 代码这样复杂的东西,那肯定不够好......
  • 很公平,我认为它会达到我的目的。 :) 我现在正在测试它。到目前为止,我可以看到输出在具有“!”时有效“。” “?”您在 text.split 部分列出的任何内容。但是,“”(空格)似乎不起作用。因此,例如输出echo 不输出颜色,但echo ! 给出回显颜色。任何想法为什么会这样?这就是我在分裂时所拥有的PreviewRTB.Text.Split(New Char() {" ", " "c, ".", ",", "?", "!"})
  • @MadsTheMan 我认为这是因为拆分会将其视为echo 。一种解决方法是“修剪”字串(echo echo),以便KeyWords 可以检查它。但是,请注意,如果您进行修剪,则还需要检查修剪前后的length 差异。
  • 很好,这似乎是一种可能性。我可以看到这是可行的,只需要根据我的目的进行一些调整,但是可以接受答案。再次感谢!你能给我举个例子,什么是 word.lenght 好?我不太确定我是否完全理解如果我从+ 1 更改为+ 3 会发生什么。或者只是一个简单的解释。
猜你喜欢
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
  • 2015-05-17
  • 1970-01-01
相关资源
最近更新 更多