【发布时间】:2020-10-28 10:58:59
【问题描述】:
我正在制作一个简单的屏幕保护程序,它会显示一组图片,而不会在全部显示之前重复它们。问题是,pictureBox 正在跳过一些更新或其他东西,或者在两张图片之间快速切换。有时它会在同一张图片上停留太久。
它在调试模式下工作得很好,即使我多次点击继续,除非我点击继续太快。
图片框更新与每 2 秒触发一次的计时器相关联。
private void timer1_Tick(object sender, EventArgs e)
{
if (pictureBox1.Image != null) { pictureBox1.Image.Dispose();}
pictureBox1.Image = (Image)siguienteImagenAMostrar.Clone();
//siguienteImagenAMostrar is an Image, and it´s the one i want to show next
pictureBox1.Invalidate();
pictureBox1.Update();
if (siguienteImagenAMostrar != null) { siguienteImagenAMostrar.Dispose(); }
siguienteImagenAMostrar = siguienteImagen(); //I try to preload the Image
}
这是 siguienteImagen() 代码,以防它与我使用的 Random 有关:
private Image siguienteImagen()
{
int imagenAmostrar;
do
{
imagenAmostrar = rand.Next(0, files.Length);
} while (currentImage == imagenAmostrar && files.Length > 1);
int original = imagenAmostrar;
if (mostrada[imagenAmostrar]) {
imagenAmostrar = (imagenAmostrar + 1) % files.Length;
while (mostrada[imagenAmostrar] && original != imagenAmostrar)
{
imagenAmostrar = (imagenAmostrar + 1) % files.Length;
}
if (imagenAmostrar == original)
{
mostrada = Enumerable.Repeat(false, files.Length).ToArray();
}
}
mostrada[imagenAmostrar] = true;
currentImage = imagenAmostrar;
string imagenMostrarString = files[imagenAmostrar];
return Image.FromFile(imagenMostrarString);
}
编辑:这个功能似乎不是问题,因为currentImage = (currentImage + 1) % files.Length简单地选择下一个图像仍然存在无法正确显示图片的问题。
mostrada 也是一个 bool 数组,它知道该图片是否已经显示。 files 是一个包含图片路径的数组。相同的索引在两者上代表相同的图像。
【问题讨论】:
-
你得到一个随机数。然后给它加一个,还要取模它。这似乎是多余的。
-
@John 那段代码是我发现的在 bool 数组中循环的方式,试图找到一些错误值,这意味着我还没有显示该图像。
-
我会创建一个列表的副本,虽然它不是空的,但选择并删除一个随机项目。 - 另外remommended 将处理图像
-
@TaW 我没想过这样做。这似乎是一种更好的方法
标签: c# .net winforms picturebox