首页 > 解决方案 > Richtextbox 多种背景颜色

问题描述

如果我们可以从另一个窗口应用程序中这样调用它,我就看到了关于拥有RichTextBox类似“进度条”的这件很酷的事情,而我也在尝试做同样的事情。

我正在查看这些方法,但我无法将它们中的任何一个应用于我正在寻找的东西,我试图看看是否有类似的问题,但我没有那么幸运。

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

对我来说看起来像一个 Richtextbox

根据 Jimi 告诉我的内容,我将解释我需要什么。标签内的字符串 rappresents 一个计时器,它必须在到达终点时将颜色更改为红色,在此之前,就像在 10 分钟时我希望它是黄色的,使用它就像一个警报。

该方法的编写方式不允许我选择我想要的颜色。之后,当计时器被按钮停止时,我希望标签重新绘制自身并将其变为空白而没有任何颜色,看起来像“文本框”。

标签: c#winforms

解决方案


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

它使用Timer类增加值并通过调用Label.Invalidate()方法生成进度条效果,该方法引发 Label 的 Paint 事件,执行label1_Paint()处理程序中的任何代码。

如果要对其进行测试,请将此代码粘贴到包含button1用于启动计时器的按钮 () 和label1生成图形效果的标签 () 的表单中。然后将这
两个事件分配Click()Button和。Paint()Label

这是它的样子:

在此处输入图像描述

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

推荐阅读