作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在 C# WinForms 中 - 我根据每 500 毫秒通过串行端口接收的数据实时绘制折线图。
e.Graphics.DrawLine 逻辑在表单的 OnPaint 处理程序中。
一旦我从串口接收到数据,我需要调用一些东西来重绘窗体,以便调用 OnPaint 处理程序。我已经尝试过 this.Refresh 和 this.Invalidate,结果是我丢失了之前在表单上绘制的所有内容。
是否有另一种方法可以在不丢失表单上绘制的内容的情况下实现这一点?
最佳答案
关键是您应该考虑将绘图数据存储在某个地方。如前所述,缓冲区位图是一种解决方案。但是,如果您没有太多要绘制的内容,有时将绘图数据存储在变量或数组中并在 OnPaint 事件中重绘所有内容会更容易也更好。
假设您收到一些应该添加到图表中的点数据。首先你创建一个点列表:
List<Point> points = new List<Point>();
然后每次你得到一个新的点,你将它添加到列表中并刷新表单:
points.Add(newPoint);
this.Refresh();
在 OnPaint 事件中放置以下代码:
private void Form_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawLines(Pens.Red, points);
}
这工作起来非常快,达到 100 000 个点,并且使用的内存比缓冲区位图解决方案少得多。但是你应该根据绘图的复杂程度来决定使用哪种方式。
关于c# - 强制表格重绘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2376998/
我是一名优秀的程序员,十分优秀!