问题描述
|
似乎可以对字符串进行多色处理的唯一选项是将一堆标签控件巧妙地组合在一起,或者使用RichTextBox并在将文本添加到控件时使用字体属性。
我正在寻找的是一种可以将某种样式的控制代码呈现为颜色的控件。考虑bash代码:
NORMAL=\'\\e[0m\'
GREEN=\'\\e[0;32m\'
BLUE=\'\\e[0;34m\'
echo -e \"This text is ${GREEN}green${NORMAL} and this text is ${BLUE}blue${NORMAL}\"
在上面,单词''green \'和\'blue \'将使用各自的颜色进行着色。我想知道是否存在具有此类功能的控件,还是我必须自己编写一些代码?
请注意,我只有VB 2010的Express副本,并且我非常想避免使用第三方控件。
解决方法
您是在专门寻找可以理解ANSI控制代码的东西,还是仅接受标记的东西?如果只需要接受标记的内容,则可以使用
RichTextBox.Rtf
属性以单个字符串设置所有控制代码和文本。
有关RTF规范,请参见http://msdn.microsoft.com/zh-cn/library/aa140277(v=office.10).aspx。
我建议您以编程方式生成一个示例文档,然后阅读Rtf
属性,并使用生成的RTF代码作为应生成内容的模板。作为参考,这是一个简单的RTF文档,在Consolas中具有两种颜色的文本(加上默认值)(回退到Courier New):
{\\ rtf1 \\ deff0 {\\ fonttbl {\\ f0 \\ fmodern \\ fcharset0 Consolas {\\ * \\ falt Courier New};}}
{\\ colortbl; \\ red255 \\ green0 \\ blue0; \\ red0 \\ green176 \\ blue80;}
\\ cf1你好\\ cf0,\\ cf2世界\\ cf0。
}
, 还有其他两种选择。首先,您可以使用图形对象和DrawString方法使用所需的任何颜色字体和样式来绘制文本。但是,这可能会很痛苦。最简单的方法是使用Web浏览器控件并使用普通的旧html。
如果您不想使用RTF,我写了这个小示例,它将允许您使用RGB代码,这不是完整的解决方案,因为您必须找出一种分配控件字符的方法。如果要测试它,请创建一个表单,并在其上放置一个按钮和一个富文本框。
Imports System.Drawing
Imports System.Text.RegularExpressions
Public Class Form1
Private Sub Button1_Click(sender As System.Object,e As System.EventArgs) Handles Button1.Click
Dim str As String = \"This text is {#00FF00}green{#000000} and this text is {#0000FF}blue{#000000}\"
PrintToRtf(str,RichTextBox1)
End Sub
Private Shared Sub PrintToRtf(Str As String,RTB As RichTextBox)
Dim mc As MatchCollection = Regex.Matches(Str,\"\\{\\#(?<Red>[0-9A-Fa-f]{2})(?<Green>[0-9A-Fa-f]{2})(?<Blue>[0-9A-Fa-f]{2})\\}\")
Dim lp As Int32 = 0
For Each mtc As Match In mc
Dim subStr As String = Str.Substring(lp,mtc.Index - lp)
Dim R,G,B As Byte
R = Integer.Parse(mtc.Groups(\"Red\").Value,Globalization.NumberStyles.AllowHexSpecifier)
G = Integer.Parse(mtc.Groups(\"Green\").Value,Globalization.NumberStyles.AllowHexSpecifier)
B = Integer.Parse(mtc.Groups(\"Blue\").Value,Globalization.NumberStyles.AllowHexSpecifier)
Dim clr As Color = Color.FromArgb(255,R,B)
RTB.SelectedText = subStr
RTB.SelectionColor = clr
lp = mtc.Index + mtc.Length
RTB.Select(RTB.TextLength,0)
Next
End Sub
End Class