在C#屏幕保护程序中旋转文本和图像的显示

时间:2013-02-26 17:01:19

标签: c# screensaver

我正在用C#编写一个屏幕保护程序。我希望它能够做到以下几点:

从文字开始。大约3秒钟或更长时间后,隐藏文本并显示图像。在接下来的3秒之后,隐藏图像显示文本并继续循环,直到用户执行退出屏幕保护程序的操作。

我做了什么: 我从一个简单的文本标签和一个计时器控件开始。我每隔3秒钟就可以在屏幕上看到文本标签更改位置。我更新了我的代码以包含一个picturebox,在我的timer_tick方法中,我插入了一个if-else语句来检查,当调用该方法时, 如果显示了文本标签,则将其隐藏并显示图片框。 否则,如果显示图片框,则隐藏它并显示文本框。代码如下所示:

  private void Form1_Load(object sender, EventArgs e)
    {
        Cursor.Hide();
        TopMost = true;

        moveTimer.Interval = 3000;
        moveTimer.Tick += new EventHandler(moveTimer_Tick);
        moveTimer.Start();
    }

    private void moveTimer_Tick(object sender, System.EventArgs e)
    {
        //Move text to new Location
        //textLabel.Left = rand.Next(Math.Max(1, Bounds.Width - textLabel.Width));
        //textLabel.Top = rand.Next(Math.Max(1, Bounds.Height - textLabel.Height));

        if (pictureBox1.Enabled == true)
            {
                pictureBox1.Hide();
                textLabel.Show();
            }

        if (textLabel.Enabled == true)
            {
                textLabel.Hide();
                pictureBox1.Show();
            }
    }

这是问题所在: 当我运行屏幕保护程序时,屏幕以文本开始,3秒后更改为图片并停在那里。

如何让它在连续循环中移动,显示/隐藏文本标签或图片框?

我是否以正确的方式实现了这一点?

请高度赞赏清晰简明的解释/答案。

谢谢!

2 个答案:

答案 0 :(得分:1)

也许您可以将状态保存在可以切换的变量中

private bool state = false; 

private void moveTimer_Tick(object sender, System.EventArgs e)
{
    //Move text to new Location
    //textLabel.Left = rand.Next(Math.Max(1, Bounds.Width - textLabel.Width));
    //textLabel.Top = rand.Next(Math.Max(1, Bounds.Height - textLabel.Height));

    if (state)
    {
        pictureBox1.Hide();
        textLabel.Show();
    }
    else
    {
        textLabel.Hide();
        pictureBox1.Show();
    }
    state = !state;
}

这样的事情怎么样?

答案 1 :(得分:1)

启用表示对象是否可以接收输入。 如果可见或不可见,则可见。

您看到它只更改一次,因为所有对象都已启用。第一个if成功,隐藏图片并显示文本。但是第二个if也会成功,显示图片并隐藏文本。由于这是一个事件回调,你永远不会看到第一个if发生,因为第二个覆盖它。

正如您在评论中意识到的那样,答案是不检查启用。相反,请检查Visible。确保使用else,否则你可能仍会遇到同样的问题。

private void moveTimer_Tick(object sender, System.EventArgs e)
{
    //Move text to new Location
    //textLabel.Left = rand.Next(Math.Max(1, Bounds.Width - textLabel.Width));
    //textLabel.Top = rand.Next(Math.Max(1, Bounds.Height - textLabel.Height));

    if (pictureBox1.Visible == true)
        {
            pictureBox1.Hide();
            textLabel.Show();
        }
    else
        {
            textLabel.Hide();
            pictureBox1.Show();
        }
}