简单的MouseMove处理

时间:2012-10-21 10:40:08

标签: c# winforms gdi+ gdi

我尝试编写一个简单的图形编辑器。我有下一个问题,当我使用SolidBrush()绘制一些曲线时,我得到了中断的一个(看图像)。我需要得到不间断的曲线。我尝试使用鼠标捕获,但它不起作用(结果相同)。我该怎么办呢?查看下面的MouseMove事件处理程序代码:

void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (isMouseDown)
            {
                pictureBox1.Capture = true; // I try to capture mouse here
                Graphics g = Graphics.FromHwnd(this.pictureBox1.Handle);
                g.FillRectangle(new SolidBrush(Color.Black), e.X, e.Y, 1, 1);
            }
        }

enter image description here

4 个答案:

答案 0 :(得分:0)

不要绘制点,而是记住最后一个鼠标位置,并从中绘制线到当前鼠标位置。

答案 1 :(得分:0)

这取决于鼠标移动的速度,有时MouseMove事件会更频繁地触发,有时不会触发。我认为这也取决于你的机器装在那个特定的moemnt上多少钱。如果你在两点之间绘制线条,它们将不会弯曲而是直线。相反,您应该查看BeziersSplines。这样你就可以根据几点得到曲线。

但你可以用你的代码做点什么。每当你的最后一个mousedown和当前的mousedown事件之间的距离大于一个阈值(你可以凭经验得到),你可以在你的曲线上添加新的点。 下面是添加一个点的示例代码:

 public bool isMouseDown { get; set; }
        Point lastPoint = Point.Empty;
        public double treshold { get; set; }
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (isMouseDown)
            {
                pictureBox1.Capture = true; // I try to capture mouse here
                Graphics g = Graphics.FromHwnd(this.pictureBox1.Handle);
                if (Math.Sqrt(Math.Pow(e.X - lastPoint.X, 2) + Math.Pow(e.Y - lastPoint.Y, 2)) > treshold)
                {
                    g.FillRectangle(new SolidBrush(Color.Black), (e.X + lastPoint.X)/2, (e.Y + lastPoint.Y)/2, 1, 1);

                }

                g.FillRectangle(new SolidBrush(Color.Black), e.X, e.Y, 1, 1);
                lastPoint = new Point(e.X, e.Y);
            }
        }

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            isMouseDown = true;
            lastPoint = new Point(e.X, e.Y);
        }

        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            isMouseDown = false;
        }

答案 2 :(得分:0)

GDI +问题,尤其是与简单任务相关的问题,如绘图,鼠标处理和正确的事件驱动排序,可以在本文中找到。

与大多数只有代码的例子不同,这个例子详细解释了原因和方法。

http://bobpowell.net/simpledraw.aspx

答案 3 :(得分:0)

除了鼠标移动的问题,你还有另一个更严重的问题。

使用图形g = Graphics.FromHwnd(this.pictureBox1.Handle)并直接在图形表面上绘图将是暂时的,因为像素将消失。

鲍勃鲍威尔对此也有很好的答案。

查看他最常问到的#1 GDI +问题。 http://bobpowell.net/picturebox.htm