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