C# Richtextbox多种背景色

C# Richtextbox多种背景色,c#,winforms,C#,Winforms,我看到了一个类似于“进度条”的RichTextBox的酷东西,如果我们可以从另一个窗口应用程序中这样调用它,我也在尝试这样做。 我当时正在研究这些方法,但我无法将其中任何一种应用于我正在寻找的东西,我试图看看是否存在类似的问题,但我没有那么幸运。 我怎样才能达到同样的结果 在我看来,它就像一个Richtextbox 根据吉米告诉我的,我会解释我需要什么。标签内的字符串表示一个计时器,当它到达末尾时,必须改变红色的颜色,在此之前,比如在10分钟时,我希望它是黄色的,将其用作警报 这种方法不允许我

我看到了一个类似于“进度条”的
RichTextBox的酷东西,如果我们可以从另一个窗口应用程序中这样调用它,我也在尝试这样做。

我当时正在研究这些方法,但我无法将其中任何一种应用于我正在寻找的东西,我试图看看是否存在类似的问题,但我没有那么幸运。

我怎样才能达到同样的结果

在我看来,它就像一个Richtextbox

根据吉米告诉我的,我会解释我需要什么。标签内的字符串表示一个计时器,当它到达末尾时,必须改变红色的颜色,在此之前,比如在10分钟时,我希望它是黄色的,将其用作警报


这种方法不允许我选择我想要的颜色。之后,当计时器被按钮停止时,我希望标签重新绘制并使其空白,没有任何颜色,看起来像一个“文本框”。

这是一个用作进度条的标签。
这只是一个示例(非常原始,我可以利用我的时间做些什么),但它展示了如何绘制提供事件的控件的表面

它使用一个类增加一个值,并通过调用该方法生成进度条效果,该方法引发标签的绘制事件,执行
label1\u Paint()
处理程序中的所有代码

如果要测试它,请将此代码粘贴到表单中,该表单包含启动计时器的按钮(
button1
)和生成图形效果的标签(
label1
) 然后将这两个事件分配给
按钮
标签

这就是它的样子:


如果您能显示您计划使用哪个RichTextBox,这将对我们有所帮助。在WPF或Winforms中,这可能有点重要吗?看起来,使用标签和一些面板可能更容易实现特定效果。你确定你需要的是RichTextBox吗。很可能是自定义实现的控件。。。你试过什么了吗?你能编辑一下问题并添加你的源代码吗?2.你看到这个了吗?你可以用任何可以画画的东西来画。可以是标签或面板。IMO iIt是一个带绘图的图片框控件,%只是其中的一个标签。我使用的是Winforms,很抱歉,我非常感谢您的示例代码员。我试图用它来更好地理解它是如何工作的,它看起来像invalidate()方法在我的项目中不起作用,因为它没有绘制进度条或任何东西,标签保持不变,你能解释一下为什么吗?@Zxhammelzx你绑定了事件处理程序(
label1_-Paint
button1_-Click
)到相应的控件(一个
按钮
和一个
标签
)?
Invalidate()
方法只会引发相应控件的绘制事件。如果将此代码复制/粘贴到表单中,表单必须具有按钮和标签(如图形示例所示)。然后,在窗体设计器中,使用“控件属性”面板,切换到“事件”视图(闪电符号),并将事件分配给控件。我在事件名称末尾缺少“_1”,感觉很糟糕。你真是个乐于助人的人!非常感谢,我做到了。另外,我不知道我们是否会这样做,你能解释一下我如何改变DrawnString中的内容并设置不同颜色的Draw长方形,这可能吗?我不是说把它们改成绘画的方法,我是问在drowing完成后是否可能。感谢you@Zxhammelzx这不是OT,因为它与您的OP(原始帖子)相关。是的,有可能。如果您正在构建一个
自定义控件
用户控件
,可能还需要为
文本
进度条
属性指定不同的颜色。我会做一个编辑来展示如何(只要我有空闲时间)。
Timer timer;
private bool TimerStarted = false;
private float ProgressMaxValue = 100;
private float Progress = 0;
private int seconds = 0;
private int cents = 0;

private void button1_Click(object sender, EventArgs e)
{
    if (TimerStarted) { TimerStop(); return; }
    timer = new Timer();
    timer.Interval = 20;
    Progress = 0;
    seconds = 0;
    cents = 0;
    timer.Tick += (s, ev) => {
        ++Progress;
        if (Progress > ProgressMaxValue) { TimerStop(); return; }
        cents += (timer.Interval / 5);
        if (cents > 99) { cents = 0; ++seconds; }
        this.label1.Invalidate();
    };
    TimerStarted = true;
    timer.Start();
}

private void TimerStop()
{
    timer.Stop();
    timer.Dispose();
    TimerStarted = false;
}

private void label1_Paint(object sender, PaintEventArgs e)
{
    StringFormat format = new StringFormat() {
        Alignment = StringAlignment.Center,
        LineAlignment = StringAlignment.Center
    };

    e.Graphics.Clear(this.label1.BackColor);
    Rectangle rect = label1.ClientRectangle;
    rect.Inflate(-1, -1);
    e.Graphics.DrawRectangle(Pens.LimeGreen, rect);
    RectangleF ProgressBar = new RectangleF(
                new PointF(3, 3),
                new SizeF((((float)rect.Width - 3) / ProgressMaxValue) * Progress, rect.Height - 4));
    e.Graphics.FillRectangle(Brushes.YellowGreen, ProgressBar);
    e.Graphics.DrawString($"0.{seconds.ToString("D2")}.{cents.ToString("D2")}", label1.Font, Brushes.White, rect, format);
}