如何根据字符串的前缀为 RichTextBox 的文本着色?
How to color the text of RichTextBox depending on the prefix of the string?
我想为 richtextbox 中的所有字符串着色。例如,如果特定字符串的前缀是
Received:
那么应该是蓝色
Send:
那么应该是红色
Info:
那么应该是绿色的
*The way I output the text in the RichTextBox is by ascending order, it means that all the newest messages will be outputted at the top of the RichTextBox, the old ones will go down.
截图:
代码:
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim msg_info As String = Nothing
If RB_Info.Checked = True Then
msg_info = "Info: "
End If
If RB_Send.Checked = True Then
msg_info = "Send: "
End If
If RB_Received.Checked = True Then
msg_info = "Received: "
End If
RichTextBox1.Text = RichTextBox1.Text.Insert(0, msg_info & TextBox1.Text & ControlChars.NewLine)
End Sub
End Class
编辑: 我试过应用这个子项,但它改变了 ListBox 中所有项目的颜色
Sub HighlightPhrase(box As RichTextBox, phrase As String, color As Color)
Dim pos As Integer = box.SelectionStart
Dim s As String = box.Text
Dim ix As Integer = 0
While True
Dim jx As Integer = s.IndexOf(phrase, ix, StringComparison.CurrentCultureIgnoreCase)
If jx < 0 Then
Exit While
End If
box.SelectionStart = jx
box.SelectionLength = phrase.Length
box.SelectionColor = color
ix = jx + 1
End While
box.SelectionStart = pos
box.SelectionLength = 0
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim msg_info As String = Nothing
If RB_Info.Checked = True Then
msg_info = "Info: "
HighlightPhrase(RichTextBox1, "Info", Color.Blue)
End If
If RB_Send.Checked = True Then
msg_info = "Send: "
HighlightPhrase(RichTextBox1, "Send", Color.Green)
End If
If RB_Received.Checked = True Then
msg_info = "Received: "
HighlightPhrase(RichTextBox1, "Received", Color.Red)
End If
RichTextBox1.Text = RichTextBox1.Text.Insert(0, msg_info & TextBox1.Text & ControlChars.NewLine)
End Sub
我已经编辑了我的解决方案,因此新行出现在 RichTextBox 的顶部。
我认为我的解决方案很丑陋,因为基本上它会在添加新行后重新绘制每行的颜色。想象一下,如果 RichTextBox 有数千行。我认为您可以通过限制 RTB 中的行数(例如 100 行)来最大限度地减少这种情况。
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim msg_info As String = Nothing
If RB_Info.Checked = True Then
msg_info = "Info: "
End If
If RB_Send.Checked = True Then
msg_info = "Send: "
End If
If RB_Received.Checked = True Then
msg_info = "Received: "
End If
RichTextBox1.Text = RichTextBox1.Text.Insert(0, msg_info & TextBox1.Text & ControlChars.NewLine)
ChangeColor()
End Sub
Private Sub ChangeColor()
Dim lines = RichTextBox1.Text.Split(vbLf)
Dim startPos As Integer, endPos As Integer = -1
Dim myColor As Color
For i = 0 To lines.Length - 2 ' minus 2 because the last one is empty string
startPos = endPos + 1
endPos = startPos + lines(i).Length
RichTextBox1.Select(startPos, endPos)
If lines(i).StartsWith("Info: ") Then myColor = Color.Red
If lines(i).StartsWith("Send: ") Then myColor = Color.Blue
If lines(i).StartsWith("Received: ") Then myColor = Color.Green
RichTextBox1.SelectionColor = myColor
Next
End Sub
End Class
使用 ListView 的替代解决方案
您可能需要查看 ListView 控件。如果你不想在列表中写任何东西,我建议你用 ListView 替换 RichTextBox。添加 ListView 后,将 View
属性 更改为 List
。
Public Class Form1
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim msg_info As String = Nothing
Dim myColor As Color
If RB_Info.Checked = True Then
msg_info = "Info: "
myColor = Color.Green
End If
If RB_Send.Checked = True Then
msg_info = "Send: "
myColor = Color.Red
End If
If RB_Received.Checked = True Then
msg_info = "Received: "
myColor = Color.Blue
End If
Dim li = New ListViewItem()
li.ForeColor = myColor
li.Text = msg_info & TextBox1.Text
ListView1.Items.Insert(0, li)
End Sub
End Class
我想为 richtextbox 中的所有字符串着色。例如,如果特定字符串的前缀是
Received:
那么应该是蓝色Send:
那么应该是红色Info:
那么应该是绿色的
*The way I output the text in the RichTextBox is by ascending order, it means that all the newest messages will be outputted at the top of the RichTextBox, the old ones will go down.
截图:
代码:
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim msg_info As String = Nothing
If RB_Info.Checked = True Then
msg_info = "Info: "
End If
If RB_Send.Checked = True Then
msg_info = "Send: "
End If
If RB_Received.Checked = True Then
msg_info = "Received: "
End If
RichTextBox1.Text = RichTextBox1.Text.Insert(0, msg_info & TextBox1.Text & ControlChars.NewLine)
End Sub
End Class
编辑: 我试过应用这个子项,但它改变了 ListBox 中所有项目的颜色
Sub HighlightPhrase(box As RichTextBox, phrase As String, color As Color)
Dim pos As Integer = box.SelectionStart
Dim s As String = box.Text
Dim ix As Integer = 0
While True
Dim jx As Integer = s.IndexOf(phrase, ix, StringComparison.CurrentCultureIgnoreCase)
If jx < 0 Then
Exit While
End If
box.SelectionStart = jx
box.SelectionLength = phrase.Length
box.SelectionColor = color
ix = jx + 1
End While
box.SelectionStart = pos
box.SelectionLength = 0
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim msg_info As String = Nothing
If RB_Info.Checked = True Then
msg_info = "Info: "
HighlightPhrase(RichTextBox1, "Info", Color.Blue)
End If
If RB_Send.Checked = True Then
msg_info = "Send: "
HighlightPhrase(RichTextBox1, "Send", Color.Green)
End If
If RB_Received.Checked = True Then
msg_info = "Received: "
HighlightPhrase(RichTextBox1, "Received", Color.Red)
End If
RichTextBox1.Text = RichTextBox1.Text.Insert(0, msg_info & TextBox1.Text & ControlChars.NewLine)
End Sub
我已经编辑了我的解决方案,因此新行出现在 RichTextBox 的顶部。
我认为我的解决方案很丑陋,因为基本上它会在添加新行后重新绘制每行的颜色。想象一下,如果 RichTextBox 有数千行。我认为您可以通过限制 RTB 中的行数(例如 100 行)来最大限度地减少这种情况。
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim msg_info As String = Nothing
If RB_Info.Checked = True Then
msg_info = "Info: "
End If
If RB_Send.Checked = True Then
msg_info = "Send: "
End If
If RB_Received.Checked = True Then
msg_info = "Received: "
End If
RichTextBox1.Text = RichTextBox1.Text.Insert(0, msg_info & TextBox1.Text & ControlChars.NewLine)
ChangeColor()
End Sub
Private Sub ChangeColor()
Dim lines = RichTextBox1.Text.Split(vbLf)
Dim startPos As Integer, endPos As Integer = -1
Dim myColor As Color
For i = 0 To lines.Length - 2 ' minus 2 because the last one is empty string
startPos = endPos + 1
endPos = startPos + lines(i).Length
RichTextBox1.Select(startPos, endPos)
If lines(i).StartsWith("Info: ") Then myColor = Color.Red
If lines(i).StartsWith("Send: ") Then myColor = Color.Blue
If lines(i).StartsWith("Received: ") Then myColor = Color.Green
RichTextBox1.SelectionColor = myColor
Next
End Sub
End Class
使用 ListView 的替代解决方案
您可能需要查看 ListView 控件。如果你不想在列表中写任何东西,我建议你用 ListView 替换 RichTextBox。添加 ListView 后,将 View
属性 更改为 List
。
Public Class Form1
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim msg_info As String = Nothing
Dim myColor As Color
If RB_Info.Checked = True Then
msg_info = "Info: "
myColor = Color.Green
End If
If RB_Send.Checked = True Then
msg_info = "Send: "
myColor = Color.Red
End If
If RB_Received.Checked = True Then
msg_info = "Received: "
myColor = Color.Blue
End If
Dim li = New ListViewItem()
li.ForeColor = myColor
li.Text = msg_info & TextBox1.Text
ListView1.Items.Insert(0, li)
End Sub
End Class