2

首先是代码

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

4 回答 4

4

移动鼠标时,您不会MouseMove为鼠标指针经过的每个像素获得一个事件。您将以相当一致的时间间隔获得它们,因此鼠标移动得越快,您获得的点就越远。

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

于 2012-12-17T16:12:36.197 回答
2

从已经做出的评论来看,您需要做的是在鼠标计算的最后一点和鼠标现在所在的点之间插入一条线。这将创建一条自由流畅的线条,正如您的评论所暗示的那样。

如果你用插值代替draw linethen 就可以让你的线弯曲..显然在这些点之间画一条线需要更少的处理时间并且可能就足够了

于 2012-12-17T16:14:47.133 回答
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);
}
于 2012-12-17T16:12:15.993 回答
0

问题是您实际上是在单独绘制一条线,并且应用程序无法跟上输入(对于鼠标经过/通过的每个像素,您不会获得 MouseEvent 调用)。

您需要跟踪前一帧的鼠标位置,然后您可以在该点和当前点之间绘制一条平滑线。您可以在 mouseEnter/mouseDown 上设置“旧”位置(无论您想要什么),然后在鼠标移动时进行绘图。确保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 对象有点狡猾。

于 2012-12-17T16:21:37.570 回答