3

我想在面板上画一条线,然后在鼠标移动时移动它。为此,我画了一条线,当鼠标移动时,我将这条线重新绘制到新位置,并通过在其上绘制一条带有背景颜色的线来删除前一条线。如果我不使用高质量平滑模式,它可以正常工作。但是如果使用高质量的平滑模式,它会在面板上留下痕迹。有人知道如何解决这个问题吗?谢谢你。这是代码

        int x_previous = 0;
        int y_previous = 0;

        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            Pen pen1 = new System.Drawing.Pen(Color.Black, 3);
            Pen pen2 = new System.Drawing.Pen(panel1.BackColor, 3);
            Graphics g = panel1.CreateGraphics();
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            g.DrawLine(pen2, new Point(0, 0), new Point(x_previous, y_previous));
            g.DrawLine(pen1, new Point(0, 0), new Point(e.Location.X, e.Location.Y));
            x_previous = e.Location.X;
            y_previous = e.Location.Y;
        }

这是 SmoothingMode 的快照

结果快照

这是没有 SmoothingMode 的快照

结果快照

4

3 回答 3

1

而不是在事件处理程序中为鼠标移动绘制线条,您应该使用它来使面板无效并在其Paint事件的处理程序中执行线条绘制。无需删除旧行。

于 2012-11-12T04:57:28.857 回答
1

最安全的选择是使用清除图形,而不是在一条线上画一条线g.Clear(panel1.BackColor)。这将擦除已绘制的所有内容,以便您可以安全地绘制一条新线:

private void panel1_MouseMove(object sender, MouseEventArgs e)
{
    Pen pen1 = new System.Drawing.Pen(Color.Black, 3);
    Pen pen2 = new System.Drawing.Pen(panel1.BackColor, 3);
    Graphics g = panel1.CreateGraphics();
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
    // Clear the graphics, creating a blank area to draw on
    g.Clear(panel1.BackColor);
    g.DrawLine(pen1, new Point(0, 0), new Point(e.Location.X, e.Location.Y));
    x_previous = e.Location.X;
    y_previous = e.Location.Y;
}

希望这可以帮助!

于 2012-11-12T04:40:21.380 回答
0

我有一段时间没有使用 WinForms,所以如果这不起作用,您将不得不原谅我。

我假设抗锯齿稍微模糊了线条的边缘,因此初始线条比笔的宽度稍微延伸得更远。这也意味着在黑线上绘图时,白笔的边缘不会完全不透明。

尝试增加白笔的宽度,直到它完全覆盖黑色,也许看看您是否可以为白笔保留较低质量的图形对象渲染,并仅对黑笔使用平滑。

于 2012-11-12T03:59:35.140 回答