定时器在WinForms

本文关键字:WinForms 定时器 | 更新日期: 2023-09-27 18:12:44

我正在使用计时器来创建启动屏幕。我想要做的是让表单淡入淡出。我首先在表单的构造函数中设置表单的透明度为0,并触发表单加载方法中的计时器。现在在我的Timer_Tick方法中,我一直增加不透明度,比如说,增加0.2。我想我应该在计时器到达间隔的一半时开始降低不透明度,但我无法做到这一点。

我不是很清楚定时器是如何工作的,但我想实现这样的东西:

if(Whatever_Timer_Value_Is <= Interval/2)  //Can't achieve this :s
this.Opacity += 2;
else
this.Opacity -=2 ;

. .是否有一种方法可以在任何时刻获得计时器的值?或者还有别的办法吗?请保持简单。我只是个业余爱好者。X (

定时器在WinForms

试试这篇文章中Servy建议的方法。我修改了表单淡出的方法来隐藏表单。

public Form1()
{
    InitializeComponent();
    this.Opacity = 0;
}

private void Form1_Load(object sender, EventArgs e)
{            
    ShowMe();
}

private void button1_Click(object sender, EventArgs e)
{
    HideMe();
}
private void ShowMe()
{
    int duration = 1000;//in milliseconds
    int steps = 100;
    Timer timer = new Timer();
    timer.Interval = duration / steps;
    int currentStep = 0;
    timer.Tick += (arg1, arg2) =>
    {
        Opacity = ((double)currentStep) / steps;
        currentStep++;
        if (currentStep >= steps)
        {
            timer.Stop();
            timer.Dispose();
        }
    };
    timer.Start();
}
private void HideMe()
{
    int duration = 1000;//in milliseconds
    int steps = 100;
    Timer timer = new Timer();
    timer.Interval = duration / steps;
    int currentStep = 100;
    timer.Tick += (arg1, arg2) =>
    {
        Opacity = ((double)currentStep) / steps;
        currentStep--;
        if (currentStep <= 0)
        {
            timer.Stop();
            timer.Dispose();
            this.Close();
        }
    };
    timer.Start();
}

请记住启动计时器的时间。这样你就可以知道过去了多少时间。

您可以使用Environment.TickCount。这是一个单调钟。

在计时器中要避免增量计算(如Opacity += 0.2;),因为不能保证在正确的时间点接收所有刻度或完全接收它们。你最好计算一下经过了多少时间,并从中计算出正确的不透明度值。

尝试为splash创建第二个表单:

Form splash = new Form();
public Form1()
{
    InitializeComponent();
    this.Visible = false;
    splash.Opacity = 0;
    splash.Show();
    _timerShow();
    _timerHide();
    this.Visible = true;
}
private async void _timerShow()
{
    while(splash.opacity!=1)
    {
        await Task.Delay(50);
        splash.opacity +=.01;
    }
}
private async void _timerHide()
{
    while(splash.opacity!=0)
    {
        await Task.Delay(50);
        splash.opacity -=.01;
    }
}

看看这个,一个c#启动界面的示例:http://www.codeproject.com/Articles/5454/A-Pretty-Good-Splash-Screen-in-C