delegate void UpdateD();
protected override void OnPaint(PaintEventArgs e)
{
MessageBox.Show("Painting");
//other stuff
}
public void Repaint()
{
if (InvokeRequired)
{
UpdateD d = new UpdateD(Repaint);
Invoke(d);
}
else
{
this.Invalidate();
this.Update();
}
}
所有这些都在我的表格代码中。消息框永远不会显示出来。
我有:
this.SetStyle(ControlStyles.UserPaint, true);
在我的表单构造函数中。
我已尝试制作一个方法,并将其添加到paint事件中:
this.Paint += new System.Windows.Forms.PaintEventHandler(this.Paint);
......但这也行不通。
任何人都知道造成这种情况的原因是什么?
编辑:有许多地方调用.Repaint()
,我知道他们都成功调用了这个方法。我查过了。
EDIT2:我做了一些调试,得出的结论是它与OnPaint操作中的foreach循环有关。
foreach (Game.mob m in world.mobs)
{
if (m.sprite != null && m.ID != PlayerID)
{
int xdif = Player.X > m.X ? Player.X - m.X : m.X - Player.X;
int ydif = Player.Y > m.Y ? Player.Y - m.Y : m.Y - Player.Y;
bool inRangeX = xdif <= viewField ? true : false;
bool inRangeY = ydif <= viewField ? true : false;
if (inRangeX && inRangeY)
{
Point pos = new Point();
if (Player.X > m.X) pos.X = DrawLoc.X - xdif;
else pos.X = DrawLoc.X + xdif;
if (Player.Y > m.Y) pos.Y = DrawLoc.Y - ydif;
else pos.Y = DrawLoc.Y + ydif;
if (ConfigurationManager.AppSettings["Debug"] == "1") SetText("Drawing mob");
newGraphics.DrawImage(m.sprite, pos);
}
}
}
Game.mob
是我的类,包含X和Y位置以及要绘制的图像。
world.mobs
是所有怪物的列表。
Player
在代码中早先声明。
上面的代码应该绘制相对于玩家的每一个怪物。奇怪的是,我在另一个程序中使用这个确切的代码并且它的工作非常完美,但在这个程序中它完全打破了代码。如果foreach循环执行任何迭代,则根本不执行OnPaint方法中的任何代码(甚至不是循环之前的代码)。