代码之家  ›  专栏  ›  技术社区  ›  Anteara

RichTextBox-每3个字符在文本颜色之间交替。c#

  •  1
  • Anteara  · 技术社区  · 12 年前

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

    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和许多其他方法。

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

    4 回复  |  直到 12 年前
        1
  •  2
  •   Francesco Baruchelli    12 年前

    我不确定我是否明白你想做什么(我看不到图像),无论如何,我会这样做:

            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

        2
  •  0
  •   Andreas    12 年前

    像这样的东西?

    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);
    }
    
        3
  •  0
  •   Anteara    12 年前

    我能够通过这样做来弄清楚这一点:

    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;
    
        }
    }
    

    感谢您的帮助:)

        4
  •  0
  •   Zen    12 年前

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

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