我正在用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秒后更改为图片并停在那里。
如何让它在连续循环中移动,显示/隐藏文本标签或图片框?
我是否以正确的方式实现了这一点?
请高度赞赏清晰简明的解释/答案。
谢谢!
答案 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();
}
}