gpt4 book ai didi

c# - 没有 OnPaint 无效

转载 作者:太空宇宙 更新时间:2023-11-03 10:24:43 25 4
gpt4 key购买 nike

我正在尝试在 Win Forms 中制作动画,我尝试了一种不同于在 timer_elapsed 处理程序中调用 Invalidate() 然后在 OnPaintHandler 中执行操作的方法。

我只是直接在一个pictureBox上画了一张图片,然后当timer_ticks的时候,我调用了Invalidate,然后我在更新的位置上手动重绘了图片。

static void tmrMoving_Elapsed(object sender, EventArgs e, Train t)
{
MainForm.playBox.Invalidate();

g.DrawImage(t.components[i], new Rectangle(
new Point(t.nextVagoonPositionX * 20, t.nextVagoonPositionY * 20),
new Size(20, 20)));
t.nextVagoonPositionX += 1;
t.nextPositionX = -1;
}

我有一个问题,当计时器滴答作响时,有时会绘制所需的图像,有时不会,例如有 30% 的机会不绘制(我有 1 秒的计时器间隔,所以我可以看到它),即使对象是移动或只是在同一位置。

我尝试过的事情:

1.在 Invalidate() args 中设置一个区域 -> 图像在旧图像旁边绘制了很多次(因此它没有在所需位置重新绘制,因为旧图像保留在它们的位置)

2.在无效后调用 Update() 或 Refresh() 或同时调用两者-> 从未显示任何图像

3.将 Update() 或 Refresh() 或两者与 Invalidate(矩形区域) 组合 -> 从未显示图像

4.设置 DoubleBuffering true -> 无效

5.摆弄 this.SetStyle(ControlStyles.UserPaint, true); -> 没有效果(顺便说一句,甚至不确定它的作用。)

最佳答案

您不应该在 OnPaint 处理程序之外直接绘制 UI 控件。在“较低级别”的 WinAPI 中,您只能在 WM_PAINT 上绘制屏幕,​​这会引发 OnPaint 事件。

将绘图代码 (g.DrawImage(...)) 移出计时器处理程序并移至 OnPaint 处理程序中。

关于c# - 没有 OnPaint 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32025817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com