使用填充椭圆闪烁的 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();
    }

使用填充椭圆闪烁的 LED 效果

除此之外,您使用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;
}

根据需要添加代码以不同的方式绘制(上面只是在红色和绿色椭圆之间切换),在计时器未激活时重置外观等。