RichTextBox中的彩色输出字符串

本文关键字:输出 字符串 彩色 RichTextBox | 更新日期: 2023-09-27 18:23:42

我正在开发一个程序,该程序调用python脚本并在richtextbox中显示输出。我在输出中为特定字符串着色时遇到问题。例如:如果字符串"hey 123"将出现在输出中,它将显示为红色。有人有答案吗?谢谢我的代码片段:

Process _cmd;
delegate void setTextCallBack(string text);
private void setText (string text)
{
    if (this.richTextBox1.InvokeRequired)
    {
        setTextCallBack d = new setTextCallBack(setText);
        this.Invoke(d, new object[] { text });
    }
    else
    {
        this.richTextBox1.Text += text + Environment.NewLine;
        richTextBox1.SelectionStart = richTextBox1.Text.Length;
        richTextBox1.ScrollToCaret();
    }
}
_cmd = new Process();
_cmd.StartInfo = cmdStartInfo;
if (_cmd.Start())
{
    _cmd.OutputDataReceived += new DataReceivedEventHandler(_cmd_OutputDataReceived);
    _cmd.ErrorDataReceived += new DataReceivedEventHandler(_cmd_ErrorDataReceived);
    _cmd.Exited += new EventHandler(_cmd_Exited);
    _cmd.BeginOutputReadLine();
    _cmd.BeginErrorReadLine();
}
else
{
    _cmd = null;
}
void _cmd_Exited(object sender, EventArgs e)
{
    _cmd.OutputDataReceived -= new DataReceivedEventHandler(_cmd_OutputDataReceived);
    _cmd.Exited -= new EventHandler(_cmd_Exited);
}
void _cmd_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
    UpdateConsole(e.Data, Brushes.Red);
}
void _cmd_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    UpdateConsole(e.Data, Brushes.Green);
}
private void UpdateConsole (string text)
{
    UpdateConsole(text, null);
}
private void UpdateConsole(string text, Brush color)
{
    WriteLine(text, color);
}
private void WriteLine(string text, Brush color)
{
    if (text != null)
    {
        setText(text);
    }
}

RichTextBox中的彩色输出字符串

以下是RichTextBoxes:的黄金法则:不要触摸文本

完成任何着色或格式化后,请不要使用richTextBox1.Text += "more text"附加文本!这将打乱所有格式。您需要的所有东西都有特殊的功能,您需要使用这些功能。

要添加,请使用

richTextBox1.AppendText("more text")

编辑时可能需要的其他方法是Copy, Paste & Cut,当然还有选择属性和方法,还需要着色和格式化。。

要给一段文本上色,你需要选择它,然后像这样应用你想要的颜色:

richTextBox1.SelectionBackColor = Color.MistyRose;  // Backcolor
richTextBox1.SelectionColor = Color.Red;            // TextColor

其他格式将使用SelectionFontSelectionIndentSelectionAlignment,然后使用一些。。

正如你所看到的,这一切都是通过先选择,然后再进行选择来实现的。

在您的代码中,您可以将setText方法头更改为:

setText (string text, Color color)

并像这样更改代码:

else
{
   int start = richTextBox1.Text.Length;  //*
   richTextBox1.AppendText(text + Environment.NewLine);
   richTextBox1.SelectionStart = start;   //*
   richTextBox1.SelectionLength = text.Length;
   richTextBox1.SelectionColor = color;
   richTextBox1.SelectionStart = richTextBox1.Text.Length;
   richTextBox1.SelectionLength = 0;
   richTextBox1.ScrollToCaret();
}

最后三行是可选的;我把它们包括在内,因为你似乎希望Caret总是在最后。。

我还想通过将函数名称更改为类似于addTextaddColoredText来使其更可读,甚至可以通过添加bool参数来控制是否应该添加NewLine来使其更加灵活。。

更新

我注意到您还使用null来调用UpdateConsoleWriteLine方法作为Brushes。这有两个问题:

  • 我们不需要Brush,而是需要Color来给RichTextBox着色
  • 你不能用null代替Color

您可以通过声明它们为SolidBrushes并使用它们的brush.Color来解决问题。但这只是一个无用且令人困惑的转折。

相反,直接传入您想要的Color,而不是在Black或RTF的ForeColor或您定义的默认颜色中传递null。:

UpdateConsole(text, Color.Black);   

UpdateConsole(text, richTextBox1.ForeColor);

等等。。

更新2

请注意代码中的更正(*);AppendText移动SelectionStart,因此我们需要存储起始值。

如果你有一个错误信息列表,比如

List<string> errors;

你可以从一个文件中填写,也许是这样的:

errors = File.ReadAllLines("d:''errors.txt").ToList();

然后测试是否相等:

setText(text,  errors.Contains(text) ? Color.Red : Color.Blue);

或者,如果只有零件匹配

setText(text,  isError(text) ? Color.Red : Color.Blue);

使用这样的函数:

bool isError(string msg)
{ foreach (string err in errors) 
  if (msg.IndexOf(err) >= 0) return true; return false; }