C#Invalidate()和Update()不调用OnPaint()

时间:2013-04-10 15:41:02

标签: c# drawing invalidation onpaint

    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方法中的任何代码(甚至不是循环之前的代码)。

0 个答案:

没有答案