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

在图片框上创建平滑线(winforms,c#),c#,.net,winforms,event-handling,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.CreateGraphic

首先是代码

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);

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


在这件事上需要帮助。

我决不会建议在替代的绘制方法之外执行实际绘制。而是调用
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);
}

移动鼠标时,鼠标指针移动的每个像素都不会出现
MouseMove
事件。您将以相当一致的时间间隔获取这些点,因此鼠标移动得越快,点之间的距离就越远


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

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


如果你用插值而不是
画线
,那么就有可能使线弯曲。。显然,在这些点之间画一条线需要更少的处理时间,可能就足够了。问题是,你实际上是在把点单独画成一条线,而应用程序无法跟上输入(你不能为鼠标经过的每个像素调用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)
}

你可以考虑做渲染的另一种方式——在鼠标事件中创建一个图形对象有点狡猾。

你怎么不是?@罗伯特?维维是一种没有实际点的自由形式的线条。无论用户移动鼠标到哪里,这条线都会延伸。由于应用程序的处理速度,这听起来像是你得到了突破