似乎可以在字符串上执行多种颜色的唯一选项是将一组标签控件巧妙地组合在一起,或者使用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}"
在上文中,“绿色”和“蓝色”字样将用各自的颜色着色。我想知道是否有一个像这样的功能的控件,或者我是否必须自己编写代码?
注意,我只有VB 2010的Express副本,我非常想避免使用第三方控件。
答案 0 :(得分:1)
您是否专门寻找能够理解ANSI控制代码的东西,或只是接受标记的东西?如果您只想要接受标记的内容,可以使用RichTextBox.Rtf
属性将所有控制代码和文本设置为单个字符串。
有关RTF规范,请参阅http://msdn.microsoft.com/en-us/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 Hello\cf0 , \cf2 world\cf0 . }
答案 1 :(得分:0)
还有其他几种选择。首先,您可以使用图形对象和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, G, B)
RTB.SelectedText = subStr
RTB.SelectionColor = clr
lp = mtc.Index + mtc.Length
RTB.Select(RTB.TextLength, 0)
Next
End Sub
End Class