【发布时间】:2019-02-05 22:54:22
【问题描述】:
所以我是一个菜鸟,请把它放在上下文中。如果我遗漏了任何明显的内容,我很抱歉。
观察以下方法:
public static void DrawImageRepeatHoriz(Bitmap i, int y)
{
int counter = 0;
while (counter < 4)
{
paint_order.Enqueue(() => buffer.Graphics.DrawImage(i, new
Point(50 * counter, 0)));
counter++;
}
/*paint_order.Enqueue(() => buffer.Graphics.DrawImage(i, new
Point(0 * 50, 0)));
paint_order.Enqueue(() => buffer.Graphics.DrawImage(i, new
Point(1 * 50, 0)));
paint_order.Enqueue(() => buffer.Graphics.DrawImage(i, new
Point(2 * 50, 0)));
paint_order.Enqueue(() => buffer.Graphics.DrawImage(i, new
Point(3 * 50, 0)));*/
}
该方法应该接受一个 Image 和一个 Y 值。它的作用是在那个 y 值下,图像将被绘制几次 - 足以让它至少填满屏幕。
所以它会沿着 y 轴上的点在屏幕上重复图像。
如您所见,我已经删除了大部分逻辑,因为我必须调试一些妨碍我的东西。
当我使用与存在的 while 循环等效的 for 循环或 while 循环本身时,
int counter似乎在循环结束之前变得不可用。我的意思是,将 50 乘以计数器的逻辑只发生一次,尽管它运行了多次。这导致的原因是,重复产生的图像不是四张,而是只有一张——四张中的最后一张。当然,我已将代码屏蔽为注释,其中手动完成重复操作。我的意思是,当然,它应该工作,for 和 while 循环也应该工作。但不知何故,当计数器变量被用于迭代时,逻辑就动摇了。
这里的其他内容是 buffer 已通过使用当前上下文和由 SomeForm.CreateGraphics() 返回的g 正确分配所以请不用担心图形按我说的手动做就好了。buffer有效,使用的参数有效。
提前致谢。
这很令人沮丧。
编辑:愚蠢的我,我没有解释paint_order。
static Queue<Action> paint_order = new Queue<Action>(20);
【问题讨论】:
-
代码一遍又一遍地将同一个对象排入队列。所以所有队列条目都与最后一个相同。使用新的 Bitmap(Image) 构造函数创建一个真实的副本。
-
这发生在我身上,我试过了,也许我在尝试时做错了什么。我会再试一次。
-
@HansPassant 好的,所以我尝试过,但又失败了。但是现在我想起来了,如果它是手动工作的,那意味着被排队的
Actions 是不一样的。这也可以从以下事实中看出:尽管使用了相同的图像,但始终会创建new Point对象。所以他们不可能是一样的吧?
标签: c# winforms for-loop while-loop gdi+