winforms 为RichTextBox中每行文本中的特定单词着色

qf9go6mv  于 2022-11-17  发布在  其他
关注(0)|答案(4)|浏览(167)

我想在一个RichTextBox中给每个相同的单词着色。我可以在一行上做,但不能在多行上做。例如,欢迎“用户”......
我希望单词user在它找到的每一行中都是一种精确的颜色。
这是我目前的想法

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字着色,其他字保持不变。

ecfdbz9o

ecfdbz9o1#

这是一个简单的类,它为RichTextBox和TextBox控件启用文本的多个Selections和Highlight。
您可以将这个类别的多个执行严修用于不同的控件。
您可以将“要选择/突出显示的单词”添加到列表中,并指定用于选择和/或突出显示文本的颜色。

Dim listOfWords As WordList = New WordList(RichTextBox1)

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

以下是类操作的可视结果:

在此示例中,单词列表使用以下内容填充:

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

在视觉化范例中,Class是以下列方式设定:

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

这是用于生成Selections和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
kokeuurv

kokeuurv2#

使用模块,您可以这样做:

Imports System.Runtime.CompilerServices

Module Utility

<Extension()>
Sub HighlightText(ByVal myRtb As RichTextBox, ByVal word As String, ByVal color As Color)
    If word = String.Empty Then Return
    Dim index As Integer, s_start As Integer = myRtb.SelectionStart, startIndex As Integer = 0
    While(__InlineAssignHelper(index, myRtb.Text.IndexOf(word, startIndex))) <> -1
        myRtb.[Select](index, word.Length)
        myRtb.SelectionColor = color
        startIndex = index + word.Length
    End While

    myRtb.SelectionStart = s_start
    myRtb.SelectionLength = 0
    myRtb.SelectionColor = Color.Black
End Sub

<Obsolete("Please refactor code that uses this function, it is a simple work-around to simulate inline assignment in VB!")>
Private Shared Function __InlineAssignHelper(Of T)(ByRef target As T, value As T) As T
    target = value
    Return value
End Function
End Module

或者,你也可以使用这个,因为它可以让你同时突出显示多个单词:

Private Sub HighlightWords(ByVal words() As String)
     Private Sub HighlightWords(ByVal words() As String)
    For Each word As String In words
        Dim startIndex As Integer = 0

        While (startIndex < rtb1.TextLength)
            Dim wordStartIndex As Integer = rtb1.Find(word, startIndex, RichTextBoxFinds.None)
            If (wordStartIndex <> -1) Then
                rtb1.SelectionStart = wordStartIndex
                rtb1.SelectionLength = word.Length
                rtb1.SelectionBackColor = System.Drawing.Color.Black
            Else
                Exit While
            End If

            startIndex += wordStartIndex + word.Length
        End While

    Next
End Sub

Source希望这对你有帮助:)

0sgqnhkj

0sgqnhkj3#

这是可行的

Public Sub HighlightText(ByVal txt As String, ByVal obj As RichTextBox)

    obj.SelectionStart = 0
    obj.SelectAll()
    obj.SelectionBackColor = Color.White

    Dim len = txt.Length
    Dim pos = obj.Find(txt, 0, RichTextBoxFinds.NoHighlight)
    While (pos >= 0)
        obj.Select(pos, len)
        obj.SelectionBackColor = Color.Yellow
        If pos + len >= obj.Text.Length Then
            Exit While
        End If
        pos = obj.Find(txt, pos + len, RichTextBoxFinds.NoHighlight)
    End While
End Sub
xam8gpfp

xam8gpfp4#

Public Sub HighlightText(ByVal txt As String, ByVal obj As RichTextBox)

    obj.SelectionStart = 0
    obj.SelectAll()
    obj.SelectionBackColor = Color.White

    Dim len = txt.Length
    Dim pos = obj.Find(txt, 0, RichTextBoxFinds.NoHighlight)
    While (pos >= 0)
        obj.Select(pos, len)
        obj.SelectionBackColor = Color.Yellow
        If pos + len >= obj.Text.Length Then
            Exit While
        End If
        pos = obj.Find(txt, pos + len, RichTextBoxFinds.NoHighlight)
    End While
End Sub

相关问题