RichTextBox - 每3个字符在文本颜色之间切换。 C#

时间:2012-09-12 07:45:16

标签: c# colors hex richtextbox alternate

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

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,还有很多其他人。

P.S。如果这样做会很慢,你能建议其他任何方法吗? 如果你想看到它,这里是完整的代码: http://pastebin.com/vHMfnZW1

4 个答案:

答案 0 :(得分: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)。

您可以找到完整的规范here以及更简单但更有用here的内容。

答案 1 :(得分: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);
}

答案 2 :(得分: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;

    }
}

感谢您的帮助:)

答案 3 :(得分:0)

我不确定你想要实现的目标。但也许这会有所帮助:

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