使用FillEllipse闪烁LED效果

时间:2014-12-12 04:03:28

标签: c# wpf wpf-controls

我想使用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();

    }

1 个答案:

答案 0 :(得分:0)

除了您使用blinking()方法阻止用户界面外,您无论如何都无法正确绘图。在处理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;
}

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