使用填充椭圆闪烁的 LED 效果
本文关键字:LED 效果 闪烁 填充 | 更新日期: 2023-09-27 18:34:04
我想使用 FillEllipse & DrawEllipse 函数来充当 LED 显示屏。但是我无法单击按钮再次禁用闪烁,因为子例程仍在运行。有什么建议吗?
bool alert = false;
bool blink = false;
private void blinking()
{
Graphics pb = pictureBox1.CreateGraphics();
SolidBrush red = new SolidBrush(Color.Red);
SolidBrush green = new SolidBrush(Color.LightGreen);
while (blink == true)
{
pictureBox1.Refresh();
if (alert == true)
{
pb.FillEllipse(red, 20, 20, 50, 50);
alert = false;
}
else
{
//pb.FillEllipse(green, 20, 20, 50, 50);
pb.DrawEllipse(Pens.Red, 20, 20, 50, 50);
alert = true;
}
Thread.Sleep(timer1.Interval);
}
}
private void blink_btn_Click(object sender, EventArgs e)
{
if (blink == false)
{
blink = true;
}
else
{
blink = false;
}
blinking();
}
除此之外,您使用blinking()
方法阻止了 UI,无论如何您都没有正确绘制。只应在处理Paint
事件时绘制。此外,如果您要做的就是自己画一些东西,那么使用PictureBox
就没有很好的理由。只需放置一个Panel
,甚至制作一个自定义控件。
但是,坚持使用"绘制到 PictureBox"方法,这就是您的代码真正应该的样子:
首先,看起来您已经将Timer
附加到表单。为什么你还没有使用它超出了我的范围,但你应该这样做。将处理程序挂接到 Tick
事件:
private void timer1_Tick(object sender, EventArgs e)
{
alert = !alert;
pictureBox1.Invalidate();
}
为 PictureBox.Paint
事件添加处理程序:
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
Brush brush = alert ? Brushes.Red : Brushes.LightGreen;
e.Graphics.FillEllipse(brush, 20, 20, 50, 50);
}
最后,使用按钮Click
处理程序切换计时器:
private void blink_btn_Click(object sender, EventArgs e)
{
timer1.Enabled = !timer1.Enabled;
}
根据需要添加代码以不同的方式绘制(上面只是在红色和绿色椭圆之间切换),在计时器未激活时重置外观等。