如何在绘制的面板上绘制其他东西?

时间:2014-12-16 13:18:28

标签: c# winforms drawing gdi+

我正在阅读很多关于C#绘图和使用图形处理程序阅读GDI +上的MSDN教程。

我希望能够绘制一个图形,我在列表中有哪些节点,但我不能使用自动放置,我需要节点在指定的位置并具有特定的外观等等,转换时间,这就是为什么我不再寻找图库了。

第一次绘画时一切都很好但是当我想要在代码中发生其他事情后绘制的东西(不是在点击控件之后)时,我无法做到。例如:

if (somethingHappens) {
  // repaint the panel adding some things
}

我所得到的只不是什么新事物,或者我早期的画作消失了。

我在OnPaint覆盖上找到了一些示例,并且在最小化时绘图消失了。当我需要在应用程序中发生某些事情时绘制其他内容时,我是否必须覆盖它或者它是完全不同的?

1 个答案:

答案 0 :(得分:1)

我寻找另一个包含您需要的信息的问答。坦率地说,这是一个基本问题,如何正确处理绘制Forms控件。 MSDN主题(如Overriding the OnPaint MethodCustom Control Painting and Rendering)提供了正确执行此操作的详细信息。但我很惊讶我无法找到任何至少直接解决这个基本问题的StackOverflow Q& A(当然有许多可以解决这个问题)。

总之...

这是在Forms代码中绘制的基本顺序:

  1. 生成一些要绘制的数据
  2. 使数据将被绘制的控件无效
  3. 通过实际绘制该数据来处理Paint事件
  4. 根据需要重复上述操作,即在数据发生变化的任何时候(例如"发生了某些事情",如您的问题中所示),您将返回步骤#1,将您想要的任何新数据添加到现有数据中收集数据,然后使控件无效,最后响应事件处理程序中的Paint事件。

    在绘制图形的情况下,这可能如下所示:

    private List<Point> _points = new List<Point>();
    
    void AddPoint(Point point)
    {
        _points.Add(point);
        panel1.Invalidate();
    }
    
    void panel1_Paint(object sender, PaintEventArgs e)
    {
        if (_points.Count < 2)
        {
            return;
        }
    
        Point previousPoint = _points[0];
    
        for (int i = 1; i < _points.Count; i++)
        {
            currentPoint = _points[i];
    
            e.Graphics.DrawLine(Pens.Black, previousPoint, currentPoint);
            previousPoint = currentPoint;
        }
    }
    

    请注意,panel1_Paint()事件是一个事件处理程序。通常,您可以通过选择Panel对象,切换到&#34;事件&#34;来通过Designer创建它。清单&#34;属性&#34;控件窗口,然后双击Paint事件的编辑字段。

    这当然是最简单的例子。您可以添加诸如以批量方式更新数据之类的内容(即,在您添加一组点之前不要使控件无效),使用不同的颜色或线条样式进行绘制,绘制图形的其他元素像轴,刻度,图例等。上面只是为了说明基本技术。

    最后一点说明:根据您需要绘制的图表中的点数,上述内容可能足够快,也可能不够快。它应该可以达到数千个左右,但是如果你开始达到数十或数十万或更多,你可能会发现将绘图缓存到位图并绘制它是有用的位图。但这是一个完全独立的问题。首先,您需要确保了解Forms绘图模型并正确使用它。