0

我尝试编写一个简单的图形编辑器。我有下一个问题,当我使用 绘制一些曲线时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);
            }
        }

在此处输入图像描述

4

3 回答 3

0

不要画点,而是记住你最后的鼠标位置,并从它画线到当前的鼠标位置。

于 2012-10-21T10:51:43.307 回答
0

这取决于鼠标移动的速度,有时 MouseMove 事件会更频繁地触发,有时则不会。我认为这还取决于您的机器在该特定时刻加载了多少。如果你在两点之间画线,它们不会是弯曲的,而是直线的。相反,您应该查看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;
        }
于 2012-10-21T10:55:27.383 回答
0

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

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

Bob Powell 对此也有很好的回答。

请参阅他的 #1 最常见的 GDI+ 问题:https ://web.archive.org/web/20131226033137/http://bobpowell.net/picturebox.aspx

于 2012-10-25T18:31:28.443 回答