【问题标题】:Richtextbox multiple back colorsRichtextbox 多种背景颜色
【发布时间】:2018-07-22 13:11:14
【问题描述】:

如果我们可以从另一个窗口应用程序中这样调用它,我看到了将RichTextBox 用作“进度条”这样的很酷的事情,而我也在尝试这样做。

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

我怎样才能达到同样的效果?

在我看来像一个 Richtextbox

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

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

【问题讨论】:

  • 如果您能显示您打算使用哪个 RichTextBox,这将对我们有所帮助。它是在 WPF 还是 Winforms 中,这可能有点重要?看起来使用标签和一些面板可能更容易实现特定效果。你确定 RichTextBox 是你需要的吗?
  • 1.很可能是自定义实现的控件...您尝试过什么吗,您能否编辑问题并添加您的源代码? 2. 你看到了吗? stackoverflow.com/questions/3529928/…
  • 你可以用任何你可以画的东西来做。可以是标签或面板。
  • IMO i是一个带有绘图的图片框控件,%只是里面的一个标签。
  • 我正在使用 Winforms,对此感到抱歉

标签: c# winforms


【解决方案1】:

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

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

如果要对其进行测试,请将此代码粘贴到包含用于启动计时器的按钮 (button1) 和生成图形效果的标签 (label1) 的表单中。
然后将两个事件 - Click() 分配给 ButtonPaint() 分配给 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);
}

【讨论】:

  • 我非常感谢您的示例代码人。我试图用它来更好地理解它是如何工作的,看起来 invalidate() 方法在我的项目中不起作用,因为它不绘制进度条或任何东西,标签保持不变,你能解释一下吗我为什么?
  • @Zxhammelzx 您是否将事件处理程序(label1_Paintbutton1_Click)绑定到相应的控件(ButtonLabel)? Invalidate() 方法只是引发相应的 Control 的 Paint 事件。如果将此代码复制/粘贴到表单中,则该表单必须有一个按钮和一个标签(如图形示例所示)。然后,在表单设计器中,使用控件属性面板,切换到事件视图(闪电符号)并将事件分配给控件。
  • 我错过了活动名称末尾的“_1”,感觉很糟糕。你真是个乐于助人的人!非常感谢。
  • 我做到了。另外,我不知道我们是否会这样 OT,您能否解释一下我如何更改 DrawnString 内部的内容并设置 DrawRectangle 的不同颜色,这可能吗?我不是在谈论将它们更改为绘画方法,我是在询问是否可以在溺水完成后。谢谢
  • @Zxhammelzx 这不是 OT,因为它与您的 OP(原帖)有关。是的,这是可能的。如果您正在构建Custom ControlUserControl,则可能还需要为TextProgressBar 属性指定不同的颜色。我将进行编辑以展示如何(只要我有空闲时间)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 2010-10-03
相关资源
最近更新 更多