MouseMove后鼠标上的DrawImage

时间:2014-02-11 12:50:31

标签: c# picturebox mousemove mousehover

我做了我想要的事情。 我想要的很简单。 我正在为学校做一个游戏塔防。 当我点击一个塔放置时,我想看到塔在移动我的图片框时发生的一切。当我移动它做我想要的时候没问题。但是当我停止移动我的鼠标时,我希望图像保持在它最后的位置(MouseHover)。 但我没有得到mousehover事件来做我想要的。当我停止移动我的鼠标时,图像消失,我的图片框中没有显示任何内容。

这是我目前用于MouseMove& amp; MouseHover: 注意:我已经尝试在mousehover事件中使用MousePosition,但这也不起作用。我希望有人可以帮我解决这个问题吗?

private void picGameArea_MouseMove(object sender, MouseEventArgs e)
    {


        Pen myPen = new Pen(Color.Black);
        if (myGameLogic.tmpTower != null)
        {
            Xpos = e.X;
            YPos = e.Y;
            Graphics paper;
            paper = picGameArea.CreateGraphics();
            paper.DrawImage(myGameLogic.tmpTower.myImage, e.X - 25, e.Y -25, 50, 50);
            paper.DrawEllipse(myPen, e.X - myGameLogic.tmpTower.Range, e.Y - myGameLogic.tmpTower.Range , myGameLogic.tmpTower.Range * 2, myGameLogic.tmpTower.Range * 2);
            picGameArea.Invalidate();

        }
    }

    private void picGameArea_MouseHover(object sender, EventArgs e)
    {
        Graphics paper;
        paper = picGameArea.CreateGraphics();
        if (myGameLogic.tmpTower != null)
        {

            paper.DrawImage(myGameLogic.tmpTower.myImage, Xpos - 25, YPos - 25, 50, 50);
        }
        picGameArea.Invalidate();
    }

1 个答案:

答案 0 :(得分:1)

图片消失,因为您的下一个Paint事件会重绘picGameArea,在该事件中,任何内容都不会重绘tmpTower的图片。

您有两个选择:

  • tmpTower事件中移动Paint
  • 启用投票,使用计时器重绘上绘制的内容。

您的代码中存在错误:

  • CreateGraphics需要处理,将其放入using或致电paper.Dispose();
  • 根本不需要处理MouseHover,此事件用于显示ToolTip之类的内容,如果鼠标位于一次 >一段时间
  • 调用Invalidate事件将对队列进行排队(这就像要求一样,稍后重新绘制我的控件,当你有时间时),而是先使用Refresh 绘画(并删除Invalidate)。

最后一个实际上也会修复你的问题......