我想使用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();
}
答案 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;
}
根据需要添加代码以进行不同的绘制(上面只是在红色和绿色椭圆之间切换),以便在计时器未激活时重置外观等。