为 RichTextBox 中每一行文本中的特定单词着色 [英] Color a specific word in every line of text in a RichTextBox

查看:51
本文介绍了为 RichTextBox 中每一行文本中的特定单词着色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想为 RichTextBox 中的每个相同的单词着色.我可以在一行上做,但不能在多行上做.例如,欢迎用户".....

I want to color every same word inside a RichTextBox. I can do it for one line but not on multiple lines. E.g., Welcome "user" .....

我希望 user 这个词在它找到的每一行中都是一个精确的颜色.
这是我到目前为止的想法:

I want the word user to be an exact color in every line it's found.
Here's with what i came up so far:

RichTextBox1.Text = "Welcome "
RichTextBox1.Select(RichTextBox1.TextLength, 0)
RichTextBox1.SelectionColor = My.Settings.color
RichTextBox1.AppendText(My.Settings.username)
RichTextBox1.SelectionColor = Color.Black
RichTextBox1.AppendText(" ........." + vbCrLf)    

form.Load上;我尝试使用 richtextbox.TextChange 事件,但它只是为最后一个 user 单词着色,其他单词保持不变.

It's on form.Load; I tried to use the richtextbox.TextChange event, but it just colors the last user word and the others are remain the same.

推荐答案

这是一个简单的类,可为 RichTextBox 和 TextBox 控件启用多个文本选择和突出显示.
您可以将此类的多个实例用于不同的控件.

This is a simple Class that enables multiple Selections and Highlights of text for RichTextBox and TextBox controls.
You can use multiple instances of this Class for different controls.

您可以将 Words to Select/HighLight 添加到列表中,并指定用于选择和/或突出显示文本的颜色.

You can add the Words to Select/HighLight to a List and specify which color to use for selecting and/or highlighting the text.

Dim listOfWords As WordList = New WordList(RichTextBox1)

listOfWords.AddRange({"Word1", "Word2"})
listOfWords.SelectionColor = Color.LightBlue
listOfWords.HighLightColor = Color.Yellow

这些是集体诉讼的视觉结果:

These are the visual results of the Class actions:

在示例中,单词列表使用以下方法填充:

In the example, the List of words is filled using:

Dim patterns As String() = TextBox1.Text.Split()
listOfWords.AddRange(patterns)

在可视化示例中,类是这样配置的:

In the visual example, the Class is configured this way:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim patterns As String() = TextBox1.Text.Split()

    Dim listOfWords As WordList = New WordList(RichTextBox1)
    listOfWords.AddRange(patterns)
    listOfWords.SelectionColor = Color.LightBlue
    listOfWords.HighLightColor = Color.Yellow

    If RadioButton1.Checked = True Then
        listOfWords.WordsSelect()
    ElseIf RadioButton2.Checked Then
        listOfWords.WordsHighLight()
    Else
        listOfWords.DeselectAll()
    End If
End Sub

这是用于生成选择和高光的类:

This is the Class used to generate the Selections and HighLights:

Imports System.Drawing.Text
Imports System.Text.RegularExpressions

Public Class WordList
    Private TextRendererFlags As TextFormatFlags =
        TextFormatFlags.Top Or TextFormatFlags.Left Or TextFormatFlags.NoPadding Or
        TextFormatFlags.WordBreak Or TextFormatFlags.TextBoxControl

    Private textControl As RichTextBox = Nothing
    Private wordsList As List(Of Word)

    Public Sub New(rtb As RichTextBox)
        textControl = rtb
        wordsList = New List(Of Word)
        ProtectSelection = False
    End Sub

    Public Property ProtectSelection As Boolean
    Public Property HighLightColor As Color
    Public Property SelectionColor As Color

    Public Sub Add(word As String)
        wordsList.Add(New Word() With {.Word = word, .Indexes = GetWordIndexes(word)})
    End Sub

    Public Sub AddRange(words As String())
        For Each WordItem As String In words
            wordsList.Add(New Word() With {.Word = WordItem, .Indexes = GetWordIndexes(WordItem)})
        Next
    End Sub
    Private Function GetWordIndexes(word As String) As List(Of Integer)
        Return Regex.Matches(textControl.Text, word).
                     OfType(Of Match)().
                     Select(Function(chr) chr.Index).ToList()
    End Function

    Public Sub DeselectAll()
        If textControl IsNot Nothing Then
            textControl.SelectAll()
            textControl.SelectionBackColor = textControl.BackColor
            textControl.Update()
        End If
    End Sub

    Public Sub WordsHighLight()
        If wordsList.Count > 0 Then
            For Each WordItem As Word In wordsList
                For Each Position As Integer In WordItem.Indexes
                    Dim p As Point = textControl.GetPositionFromCharIndex(Position)
                    TextRenderer.DrawText(textControl.CreateGraphics(), WordItem.Word,
                                          textControl.Font, p, textControl.ForeColor,
                                          HighLightColor, TextRendererFlags)
                Next
            Next
        End If
    End Sub

    Public Sub WordsSelect()
        DeselectAll()
        If wordsList.Count > 0 Then
            For Each WordItem As Word In wordsList
                For Each Position As Integer In WordItem.Indexes
                    textControl.Select(Position, WordItem.Word.Length)
                    textControl.SelectionColor = textControl.ForeColor
                    textControl.SelectionBackColor = SelectionColor
                    textControl.SelectionProtected = ProtectSelection
                Next
            Next
        End If
    End Sub

    Friend Class Word
        Property Word As String
        Property Indexes As List(Of Integer)
    End Class
End Class

这篇关于为 RichTextBox 中每一行文本中的特定单词着色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆