133 votes

Colorier différentes parties d'une chaîne RichTextBox

J'essaie de colorer des parties d'une chaîne de caractères à ajouter à un RichTextBox. J'ai une chaîne construite à partir de différentes chaînes de caractères.

string temp = "[" + DateTime.Now.ToShortTimeString() + "] " +
              userid + " " + message + Environment.NewLine;

Voici à quoi ressemblerait le message une fois qu'il sera construit.

[21:23] Utilisateur : mon message ici.

Je veux que tout ce qui se trouve entre les crochets [9:23] soit d'une couleur, que 'user' soit d'une autre couleur et que le message soit d'une autre couleur. J'aimerais ensuite que la chaîne soit ajoutée à ma RichTextBox.

Comment puis-je y parvenir ?

1 votes

6 votes

J'ai fait des recherches et je n'ai rien trouvé d'utile.

0 votes

Merci pour cette solution simple, qui fonctionne bien pour moi. N'oubliez pas d'utiliser la fonction AppendText(...) chaque fois que vous voulez ajouter du texte, et non l'opérateur '+=', sinon les couleurs appliquées ne seront pas prises en compte.

1voto

En sélectionnant le texte comme dit de quelqu'un, que la sélection apparaisse momentanément. Dans Windows Forms applications il n'y a pas d'autres solutions pour le problème, mais aujourd'hui, j'ai trouvé une mauvaise façon, qui fonctionne, de résoudre le problème : vous pouvez mettre un PictureBox en chevauchement avec le RichtextBox avec la capture d'écran de si, pendant la sélection et le changement de couleur ou de police, le faire après réapparaître tous, lorsque l'opération est terminée.

Le code est ici...

//The PictureBox has to be invisible before this, at creation
//tb variable is your RichTextBox
//inputPreview variable is your PictureBox
using (Graphics g = inputPreview.CreateGraphics())
{
    Point loc = tb.PointToScreen(new Point(0, 0));
    g.CopyFromScreen(loc, loc, tb.Size);
    Point pt = tb.GetPositionFromCharIndex(tb.TextLength);
    g.FillRectangle(new SolidBrush(Color.Red), new Rectangle(pt.X, 0, 100, tb.Height));
}
inputPreview.Invalidate();
inputPreview.Show();
//Your code here (example: tb.Select(...); tb.SelectionColor = ...;)
inputPreview.Hide();

Le mieux est d'utiliser WPF ; cette solution n'est pas parfaite, mais pour Winform, elle fonctionne.

1voto

N.Tesla Points 1

J'ai créé cette fonction après avoir fait des recherches sur Internet car je voulais imprimer une chaîne XML lorsque vous sélectionnez une ligne dans une grille de données.

static void HighlightPhrase(RichTextBox box, string StartTag, string EndTag, string ControlTag, Color color1, Color color2)
{
    int pos = box.SelectionStart;
    string s = box.Text;
    for (int ix = 0; ; )
    {
        int jx = s.IndexOf(StartTag, ix, StringComparison.CurrentCultureIgnoreCase);
        if (jx < 0) break;
        int ex = s.IndexOf(EndTag, ix, StringComparison.CurrentCultureIgnoreCase);
        box.SelectionStart = jx;
        box.SelectionLength = ex - jx + 1;
        box.SelectionColor = color1;

        int bx = s.IndexOf(ControlTag, ix, StringComparison.CurrentCultureIgnoreCase);
        int bxtest = s.IndexOf(StartTag, (ex + 1), StringComparison.CurrentCultureIgnoreCase);
        if (bx == bxtest)
        {
            box.SelectionStart = ex + 1;
            box.SelectionLength = bx - ex + 1;
            box.SelectionColor = color2;
        }

        ix = ex + 1;
    }
    box.SelectionStart = pos;
    box.SelectionLength = 0;
}

et c'est ainsi que vous l'appelez

   HighlightPhrase(richTextBox1, "<", ">","</", Color.Red, Color.Black);

0voto

kzelda Points 11
private void Log(string s , Color? c = null)
        {
            richTextBox.SelectionStart = richTextBox.TextLength;
            richTextBox.SelectionLength = 0;
            richTextBox.SelectionColor = c ?? Color.Black;
            richTextBox.AppendText((richTextBox.Lines.Count() == 0 ? "" : Environment.NewLine) + DateTime.Now + "\t" + s);
            richTextBox.SelectionColor = Color.Black;

        }

0voto

Jenda Points 11

En utilisant la sélection dans WPF, en agrégeant plusieurs autres réponses, aucun autre code n'est nécessaire (sauf l'enum Severity et la fonction GetSeverityColor).

 public void Log(string msg, Severity severity = Severity.Info)
    {
        string ts = "[" + DateTime.Now.ToString("HH:mm:ss") + "] ";
        string msg2 = ts + msg + "\n";
        richTextBox.AppendText(msg2);

        if (severity > Severity.Info)
        {
            int nlcount = msg2.ToCharArray().Count(a => a == '\n');
            int len = msg2.Length + 3 * (nlcount)+2; //newlines are longer, this formula works fine
            TextPointer myTextPointer1 = richTextBox.Document.ContentEnd.GetPositionAtOffset(-len);
            TextPointer myTextPointer2 = richTextBox.Document.ContentEnd.GetPositionAtOffset(-1);

            richTextBox.Selection.Select(myTextPointer1,myTextPointer2);
            SolidColorBrush scb = new SolidColorBrush(GetSeverityColor(severity));
            richTextBox.Selection.ApplyPropertyValue(TextElement.BackgroundProperty, scb);

        }

        richTextBox.ScrollToEnd();
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X