在图片框上创建平滑线(winforms,c#)

时间:2012-12-17 16:09:21

标签: c# .net winforms event-handling

首先是代码

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {

            System.Drawing.Graphics g;
            System.Drawing.SolidBrush brush = new System.Drawing.SolidBrush(Color.Blue);
            g = pictureBox1.CreateGraphics();
            g.FillRectangle(brush, e.X, e.Y, 5, 5);

    }

只要鼠标在图片框上移动并创建像素,此事件处理程序就会启动。现在的问题是,只要我慢慢移动鼠标,所有这些像素形成一条线。然而,每当我快速移动鼠标时,线条断裂,我看到的只是它们之间有宽空间的点。

在这件事上需要帮助。

4 个答案:

答案 0 :(得分:4)

移动鼠标时,鼠标指针移动的每个像素都不会得到MouseMove事件。你会以相当一致的时间间隔得到它们,所以鼠标移动得越快,得分就越远。

您需要做的是存储收到的最后一个点的位置,并使用旧位置和新位置之间的DrawLine绘制实际线。

答案 1 :(得分:2)

根据已经发表的评论判断,您需要做的是在鼠标计算的最后一点和鼠标现在的点之间插入一条线。这将创建一条自由流畅的线条,如您的评论所示。

如果你插入而不是draw line那么就可以使你的线条弯曲。显然在这些点之间画一条线需要更少的处理时间并且可能就足够了

答案 2 :(得分:1)

我绝不会建议在重写的Paint方法之外执行实际绘图。相反,请致电Invalidate()

我会用这种方式编辑你的代码:

void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    //Store necessary painting data from e
    pictureBox1.Invalidate();
}

private void OnPaint(object sender, PaintEventArgs e)
{
    var g = e.Graphics;
    //Handle painting logic
    base.OnPaint(e);
}

答案 3 :(得分:0)

问题在于你有效地单独绘制一条线,并且应用程序无法跟上输入(你没有得到鼠标经过/通过的每个像素的MouseEvent调用。)

您需要跟踪前一帧的鼠标位置,然后您可以在该点和当前点之间绘制平滑的线。你可以在mouseEnter / mouseDown上设置'old'位置(无论你想要什么),然后在鼠标移动时进行绘图。确保在进行任何绘图之前设置oldMousePos变量非常重要,否则您将在整个地方都有行(甚至可能值得使用检查变量来确保它是最新的)。

绘图代码:

private System.Drawing.Point oldMousePos; // old mouse position

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
        System.Drawing.Point curMousePos = e.Location;
        System.Drawing.Graphics g;
        System.Drawing.Pen brush = new System.Drawing.Pen(Color.Blue, 5); // width of 5
        g = pictureBox1.CreateGraphics();
        g.DrawLine(brush, oldMousePos.X, oldMousePos.Y, curMousePos.X, curMousePos.Y); // use a pen for lines rather than a brush (between 2 points)
        g.Dispose(); // mark the graphics object for collection
        oldMousePos = curMousePos; // set old to be this (so you get a continuous line)
}

您可能会考虑另一种进行渲染的方法 - 在鼠标事件中创建一个Graphics对象有点狡猾。