c#中的闪烁标签backColor
本文关键字:标签 backColor 闪烁 | 更新日期: 2023-09-27 18:03:15
我有一个包含4个标签的表单。我希望这些标签以指定的频率闪烁,如12.5、10、8和4赫兹。我使用定时器,但它不能正常工作,它们以低得多的频率闪烁,我知道这是因为在下面的freqMethod
中嵌套if
s。我该如何解决这个问题?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Timers;
using System.Threading;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
System.Timers.Timer mainTimer;
private int counter = 0;
Color lColor = Color.FromArgb(255, 192, 128);
bool buttonPressed = false;
public Form1()
{
InitializeComponent();
label1.BackColor = lColor;
label2.BackColor = lColor;
label3.BackColor = lColor;
label4.BackColor = lColor;
mainTimer = new System.Timers.Timer(1);
mainTimer.Elapsed += new ElapsedEventHandler(timerElapsed);
}
private void button2_Click(object sender, EventArgs e)
{
if (buttonPressed)
{
mainTimer.Enabled = false;
buttonPressed = !buttonPressed;
counter = 0;
}
else
{
mainTimer.Enabled = true;
buttonPressed = !buttonPressed;
counter = 0;
}
}
//Frequency Method
public void freqMethod()
{
if (counter % 80 == 0)
if (label4.backColor == lColor)
label4.backColor = Color.black;
else
label4.backColor = lColor;
if (counter % 100 == 0)
if (label3.backColor == lColor)
label3.backColor = Color.black;
else
label3.backColor = lColor;
if (counter % 125 == 0)
if (label2.backColor == lColor)
label2.backColor = Color.black;
else
label2.backColor = lColor;
if (counter % 250 == 0)
if (label1.backColor == lColor)
label1.backColor = Color.black;
else
label1.backColor = lColor;
}
private void timerElapsed(object source, ElapsedEventArgs e) {
counter++;
freqMethod();
}
}
}
给定以下值(如果您想使用一个计时器同步它们),它们可以拥有的公共间隔是5ms。所以你需要每次拨5毫秒计时器并检查频率。但是请注意使用计时器,如下所示:
12.5hz = 80ms
10hz = 100ms
8hz = 125ms
4hz = 250ms
来自MSDN使用System.Timers.Timer
(https://msdn.microsoft.com/en-us/library/system.timers.timer.interval(v=vs.110).aspx)的备注参见备注部分
您使用Interval属性来确定触发已经过的事件。因为Timer类依赖于系统时钟,它具有与系统时钟相同的分辨率。这意味着经过的事件将在一个由解析定义的间隔内触发如果Interval属性小于系统时钟的分辨率。以下示例设置间隔属性为5毫秒。在Windows 7系统上运行时其系统时钟的分辨率约为15毫秒,事件大约每15毫秒触发一次,而不是每次触发一次5毫秒
但是如果你可以为每个定时器使用多个定时器,那么你可以像Yeldar提到的那样设置定时器的每个间隔。
你不需要计时器迭代每秒,因为你跳过它的每一个n
迭代,而他们占用太多的资源。你可以通过Timer
的Interval
值来获得所需的频率和足够的性能。
例如,对于频率8 Hz,您只需要计时器每125毫秒(每秒8次)触发一个事件。
我将提供一个double
频率的例子,以使其与间隔<1. 例如,如果你设置频率为0.5
,颜色将每2秒改变一次。
的例子:
public Form1()
{
double frequencyInHz = 8.0; // here goes your frequency
int interval = (int)Math.Round(1000.0 / frequencyInHz); // 125ms in this case
mainTimer = new Timer(interval);
mainTimer.Elapsed += new ElapsedEventHandler(timerElapsed);
}
private void timerElapsed(object source, ElapsedEventArgs e) {
if (label2.BackColor == lColor)
label2.BackColor = Color.Black;
else
label2.BackColor = lColor;
}
如果您需要多个标签以不同的方式改变它们的颜色,您将需要制作多个计时器以获得良好的性能
试试这个(除了由Joel或Yeldar提出的定时器间隔修改):
if (counter % 80 == 0)
{
label4.backColor = label4.backColor == lColor ? Color.black : lColor;
label4.Refresh() ;
}