我尝试编写一个简单的图形编辑器。我有下一个问题,当我使用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);
}
}
答案 0 :(得分:0)
不要绘制点,而是记住最后一个鼠标位置,并从中绘制线到当前鼠标位置。
答案 1 :(得分:0)
这取决于鼠标移动的速度,有时MouseMove事件会更频繁地触发,有时不会触发。我认为这也取决于你的机器装在那个特定的moemnt上多少钱。如果你在两点之间绘制线条,它们将不会弯曲而是直线。相反,您应该查看Beziers和Splines。这样你就可以根据几点得到曲线。
但你可以用你的代码做点什么。每当你的最后一个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 +问题,尤其是与简单任务相关的问题,如绘图,鼠标处理和正确的事件驱动排序,可以在本文中找到。
与大多数只有代码的例子不同,这个例子详细解释了原因和方法。
答案 3 :(得分:0)
除了鼠标移动的问题,你还有另一个更严重的问题。
使用图形g = Graphics.FromHwnd(this.pictureBox1.Handle)并直接在图形表面上绘图将是暂时的,因为像素将消失。
鲍勃鲍威尔对此也有很好的答案。查看他最常问到的#1 GDI +问题。 http://bobpowell.net/picturebox.htm