2

我想我错过了 Invalidate 方法...我试图在 mousedown 的鼠标位置绘制一个正方形的左上角,然后右下角是鼠标的当前位置. 下面是在 MouseMove 事件上触发的方法。父级是一个带有pictureBox 子级的面板。(我试图在这些之上绘制。)

问题似乎与pictureBoxMain.Invalidate(). 当注释掉代码时,代码的行为与预期一样,并绘制了无数个正方形。

[Graphicsg是由pictureBox 创建的,因此我在pictureBox 上调用Invalidate 方法。]

当我取消注释无效行时,当鼠标移动时会绘制一个框,但一旦它停止移动,框就会消失。我无法为我的生活解决为什么。当我尝试调试代码时,似乎在鼠标不移动时正在调用 MouseMove 方法,这没有任何意义。

任何帮助是极大的赞赏!

private void pictureBoxMain_MouseMove(object sender, MouseEventArgs e)
    {
        if (MouseDrawLeft)
        {
            //Move
        }
        else if (MouseDrawRight)
        {
            MouseLast = e.Location;
            if (MouseFirst != MouseLast)
            {
                pictureBoxMain.Invalidate();

                Point bl = new Point(MouseFirst.X, MouseLast.Y);
                Point tr = new Point(MouseLast.X, MouseFirst.Y);

                g.DrawLine(pen, MouseFirst, tr);
                g.DrawLine(pen, MouseFirst, bl);
                g.DrawLine(pen, bl, MouseLast);
                g.DrawLine(pen, tr, MouseLast);
            }
        }
    }
4

1 回答 1

1

每个组件(按钮、文本框、窗口...)都有其 Paint 方法。这由 Windows 定期调用(例如每秒 50 次)以绘制对象。

您所做的是在对象上绘制一些东西 - 但在一毫秒内,它消失了,因为 Paint 方法覆盖了它。您需要覆盖框架的 Paint 方法并在那里进行绘画 - 这样,每次 Windows 询问时都会绘制您的图纸。

于 2012-04-26T14:54:20.143 回答