0

我正在用 C# 编写一个屏幕保护程序。我希望它执行以下操作:

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

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

  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 秒后变为图片并停在那里。

我该怎么做才能让它在一个连续的循环中移动,显示/隐藏文本标签或图片框?

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

请清晰简洁的解释/答案将不胜感激。

谢谢!

4

2 回答 2

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

这样的事情怎么样?

于 2013-02-26T17:04:52.707 回答
1

Enabled 表示对象是否可以接收输入。可见是说它是否可见。

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

正如您在评论中所意识到的那样,答案是不启用检查。相反,请检查可见。确保也使用 an 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();
        }
}
于 2013-02-26T17:09:32.260 回答