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();
        }
    }
}

c#中的闪烁标签backColor

给定以下值(如果您想使用一个计时器同步它们),它们可以拥有的公共间隔是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迭代,而他们占用太多的资源。你可以通过TimerInterval值来获得所需的频率和足够的性能。

例如,对于频率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() ;
}