1

次のようなリッチ テキスト ボックスに 16 進データを表示しています。

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++)
        if (i % 6 == 2)
        {
            richTextBox1.SelectionStart = i - 2;
            richTextBox1.SelectionLength = 3;
            richTextBox1.SelectionColor = Color.Red;
        }
于 2012-09-12T08:59:55.860 に答える
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 に答える