1

我在富文本框中显示十六进制数据,如下所示:

64 73 67 66 34 33 74 67 35 34 36 79 37 35 79 36
33 67 35 36 67 35 36 33 79 68 34 36 37 38 72 74

我希望它每 3 个字符显示为不同的颜色。即每个位(2个数字和一个具体的空格)是不同的颜色。

我尝试做的只是在设计器模式下将文本颜色设置为蓝色,以便将处理时间减半。然后我将每 2 3 个字符更改为红色。

但是,这就是正在发生的事情:

http://i.imgur.com/ZzDtO.png

这是代码:

for (int i = 0; i < richTextBox1.TextLength; i++)
    if (i % 4 == 1)
    {
        richTextBox1.SelectionStart = i;
        richTextBox1.SelectionLength = 2;
        richTextBox1.SelectionColor = Color.Red;
    }

很明显我的数学是错误的,我想不出任何可行的方法。我已经尝试过 i % 3 = 0、selectionLength = 3 等等。

PS如果这会很慢,你能建议其他方法吗?如果你想看的话,这里是完整的代码:http: //pastebin.com/vHMfnZW1

4

4 回答 4

2

我不确定我得到了你想要做什么(我看不到图像),无论如何我会这样做:

        for (int i = 3; i < richTextBox1.TextLength; i += 6)
        {
            richTextBox1.SelectionStart = i;
            richTextBox1.SelectionLength = 2;
            richTextBox1.SelectionColor = Color.Red;
        }

根据您的评论进行编辑。

这是因为更改选择是一项缓慢的操作。事情可以更好地对字符串进行操作,并利用您可以设置 RichTextBox 的 Rtf 属性。您可以在慢循环之后检查控件的 Rtf 属性,以了解您必须构建什么,它是一个字符串,由定义使用的字体和颜色的部分、实际文本和一个简单的结束部分组成。

特别是要使用蓝色和红色,您可以定义此“颜色表” {\\colortbl ;\\red0\\green0\\blue255;\\red255\\green0\\blue0;},然后使用代码\\cf1\\cf2 分别指定蓝色和红色。

这段代码应该更快:

        StringBuilder sb = new StringBuilder();
        sb.Append("{\\rtf1\\ansi\\ansicpg1250\\deff0\\deflang1050{\\fonttbl{\\f0\\fnil\\fcharset238 Microsoft Sans Serif;}}\r\n{\\colortbl ;\\red0\\green0\\blue255;\\red255\\green0\\blue0;}\r\n\\viewkind4\\uc1\\pard\\f0\\fs17");
        string[] col = new string[] { "\\cf1 ", "\\cf2 " };
        int idxCol = 0;
        for (int i = 0; i < myText.Length; i++)
        {
            if (i % 3 == 0)
            {
                sb.Append(col[idxCol]);
                idxCol = (idxCol + 1) % 2;
            }
            sb.Append(myText[i]);
        }
        sb.Append("\\par\r\n}\r\n");

        richTextBox1.Rtf = sb.ToString();

请注意,我并不深入了解 RTF 语法,只知道颜色部分,因为它过去对我很有用。我认为第一部分和最后一部分是不变的。如您所见,颜色定义为 RGB,并由常量字符串“\cf”引用,后跟颜色表中的索引(基于 1)。

你可以在这里找到完整的规范和一些更简单但我发现在这里有用的东西。

于 2012-09-12T08:35:19.637 回答
0

像这样的东西?

for (int i = 0; i < richTextBox1.TextLength; i++)
    var oldStart = richTextBox1.SelectionStart;
    var oldLength = richTextBox1.SelectionLength;
    if (richTextBox1.Text[i-1] == ' ')
    {

        richTextBox1.Select(i);
        richTextBox1.SelectionColor = Color.Red;
    }
    // Restore selection
    richTextBox1.Select(oldStart, oldLength);
}
于 2012-09-12T08:14:27.327 回答
0

我能够通过这样做来解决这个问题:

for (int i = 0; i < richTextBox1.TextLength; i++)
{
    if (richTextBox1.Text[i] == ' ')
    {
        if (colourIt == true)
        {
            richTextBox1.SelectionStart = i;
            richTextBox1.SelectionLength = 3;
            richTextBox1.SelectionColor = Color.Red;
            colourIt = false;
        }
        else colourIt = true;

    }
}

谢谢您的帮助 :)

于 2012-09-12T08:27:57.687 回答
0

我不确定你想要达到什么目的。但也许这会有所帮助:

    for (int i = 0; i < richTextBox1.TextLength; i++)
        if (i % 6 == 2)
        {
            richTextBox1.SelectionStart = i - 2;
            richTextBox1.SelectionLength = 3;
            richTextBox1.SelectionColor = Color.Red;
        }
于 2012-09-12T08:59:55.860 回答