【问题标题】:Moving a high quality line on a panel c#在面板上移动高质量的线条 c#
【发布时间】:2012-11-12 12:57:28
【问题描述】:

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

        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 的快照

【问题讨论】:

    标签: c# system.drawing windows-applications


    【解决方案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;
    }
    

    希望这会有所帮助!

    【讨论】:

    • 这是更好的方法,除非有其他奇怪的理由不清除该区域。我不太熟悉,不知道只画线是否有性能优势,但如果有的话,我猜它足够小,不用担心。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 感谢您的回答。我以前试过这个,它适用于生产线,但仍然在生产线的末端留下一些残留物。
      • 您是否尝试进一步增加白笔的宽度?您可能还需要做一些矢量数学运算来扩展您在它们之间绘制白线的点。
      猜你喜欢
      • 1970-01-01
      • 2015-04-08
      • 2020-06-29
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 2011-01-27
      • 1970-01-01
      • 2017-03-13
      相关资源
      最近更新 更多