【问题标题】:Creating a custom graph in Winforms在 Winforms 中创建自定义图形
【发布时间】:2012-12-15 11:08:28
【问题描述】:

我正在尝试为我的应用程序制作一个简单的图表,该图表显示每 100 毫秒的实时数据。所以我想我可以使用DrawCurve 方法绘制图形线,并从以下代码开始:

class BufferedPanel : Panel
{
     public BufferedPanel()
     {
        this.DoubleBuffered = true;         //to avoid flickering of the panel
     }                    
}



class Form2: Form
{
    BufferedPanel panel1 = new BufferedPanel();
    List<Point> graphPoints = new List<System.Drawing.Point>();

    private void Form2_Load(object sender, EventArgs e)
    {
       this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint);
    }

    private void panel1_Paint(object sender, PaintEventArgs e)
    {
        using (Graphics g = e.Graphics)
        {
            Point[] points = graphPoints.ToArray();
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

            if (points.Length > 1)
               g.DrawCurve(graphPen, points);
         }
     }

     private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
     {
         graphPoints.Add(new System.Drawing.Point(counter * steps, (int)(float)e.UserState));      //x - regular interval decided by a constant; y - simulated by background worker
         panel1.Refresh();
         counter++;
     }

}

到目前为止,我正在从后台工作线程模拟 graphPoints 的值。我的问题是,当我对面板进行双重缓冲时,我无法看到图表线。当我将双缓冲设置为 false 时效果很好。我是使用Graphics 绘图的新手。所以我不太确定它是如何工作的。请帮帮我。

另外,当图形线到达面板末端时,我想实现AutoScrolling。你能提出一个关于如何做的想法吗?

这是我的工作图的图像:

【问题讨论】:

    标签: c# winforms doublebuffered


    【解决方案1】:
        using (Graphics g = e.Graphics)
    

    这很糟糕。这会破坏传递给 Paint 事件处理程序的 Graphics 对象。当您的事件处理程序返回时,对该对象无能为力,它是一只死鹦鹉。所以不要指望之后会发生任何事情,包括打开双缓冲时需要发生的事情,需要将缓冲区绘制到屏幕上才能看到。

    正确使用 using 语句或 Dispose() 方法有一个简单的规则。如果您创建了一个对象,那么您就拥有它,并且您可以销毁它。放弃它不是你创造的。

    一些证据表明您也弄错了“graphPen”变量。笔绝对是您在 Paint 事件处理程序中创建和销毁的对象。不要存储一个,这只是在 GDI 堆中不必要地占用空间,不值得创建一个所需的几微秒。你肯定会为笔使用 using 语句。

    所以快速解决方法是:

        var g = e.Graphics;
    

    【讨论】:

    • 感谢您纠正错误。现在运行良好。你能帮我实现面板的自动滚动吗?
    • 好的,点击按钮说明您的问题。
    • 这是这个问题的一部分。无论如何,我会更深入地研究它。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多