【问题标题】:How to use the paint event to draw freehand on a panel? [duplicate]如何使用paint事件在面板上徒手绘制? [复制]
【发布时间】:2017-11-12 00:36:45
【问题描述】:

所以我意识到这样做:

panel1.CreateGraphics()

被严重看不起,但我正在制作一个绘画应用程序,我看不到任何其他方式,只是因为如果我调用 panel1.Invalidate(); 它显然不会保存用户绘制的线条。 所以这是我的代码:

 private void pnlPaintPanel_MouseDown(object sender, MouseEventArgs e)
    {
        shouldPaint = true;
        prePoint = new Point(e.X, e.Y);
    }

    private void pnlPaintPanel_MouseUp(object sender, MouseEventArgs e)
    {
        shouldPaint = false;
    }

    private void pnlPaintPanel_MouseMove(object sender, MouseEventArgs e)
    {
        curPoint = new Point(e.X, e.Y);
        if (shouldPaint)
        {
            pnlPaintPanel.Invalidate();
        }
        prePoint = new Point(e.X, e.Y);
    }

    private void pnlPaintPanel_Paint(object sender, PaintEventArgs e)
    {
        using (Pen p = new Pen(chosenColor, penSize))
        {
            p.StartCap = LineCap.Round;
            p.EndCap = LineCap.Round;
            e.Graphics.DrawLine(p, prePoint, curPoint);
        }

    }

这显然不起作用,因为它只会立即清除用户放下的任何油漆。我敢肯定有一个聪明的方法。谁能帮忙?

【问题讨论】:

  • Here is an example - 诀窍是拥有一个绘制所需数据的 List。从 List> 开始!听起来很复杂?不是当你想到它:你想要几条(list1)曲线(list2)..
  • 所以我尝试了这个,你是对的,它有效,(实际上我已经阅读了你关于它的精彩帖子,非常丰富的知识学到了很多)。我唯一的问题是,由于面板无效,它不断闪烁白色(因为它正在重新绘制),使用较大的笔,线条在转折点处出现故障,并且当笔大小发生变化时,所有线条都会改变大小。闪烁的面板是主要问题,知道有什么方法可以解决这个问题吗?
  • 您需要通过反射或创建子类对面板进行双缓冲。在这种情况下,我建议使用一个子类,因为它允许您向它添加更多行为。Here is an example - class DrawPanel : Panel { public DrawPanel() { DoubleBuffered = true; } })
  • 对于线条中的故障,请为这些 Pen 属性设置合适的值:LineJoin、MiterXyz、End/StartCaps!对于斜接使用 ca。笔宽的 1/2。我通常更喜欢圆形帽和连接..

标签: c# graphics


【解决方案1】:

有两种方法可以做到这一点。

  1. 而不是直接绘制到面板有一个Bitmap并使用Graphics.FromImage(来获取图形对象,然后只需将面板的背景设置为位图。

  2. 将所有绘图记录为一系列步骤,然后在每次绘制事件时重新绘制步骤。

【讨论】:

  • 对于真正复杂的绘图,您可以将两者结合起来并“缓存”每 100 或 1000 .. 位图中的点 owrth..
猜你喜欢
  • 2019-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
相关资源
最近更新 更多