熟悉Lab/Windows或者LabView编程的人都应该知道里面有一种控件叫做"StripChart",中文称为图表控件.这种控件用来绘画与时间相关的波形时特别好用.我使用过很多种语言开发程序,但最后感到沮丧的是没有一种语言让我感到天衣无缝的具备各种优点.
Lab/Windows或LabView的界面风格并不是我喜欢的,NI产品的界面做出来总是有厚重的感觉,而且对Windows的很多界面风格都不能很好的支持.我倒是不责怪NI开发人员的拙劣,本来NI的产品主要用于工业控制,界面并不是它所关注的性能.NI软件中很多好的空间在工业控制中很是直观好用,可惜它的基于COM机制的控件在微软系列开发工具中引用会显示"Evaluation
....",而且只限30天使用,虽然有破解的方法,我实在懒得在网上到处搜索破解的方法.
对于做通讯,控制软件的工程师来讲,自己去书写各种性能卓越的控件虽然也是软件水平的表现,但对我的看法来讲,人的精力是有限的,费那么大的力气去画一幅图画实在是"不务正业",身边类似爱好的工程师我也是见过的,我觉得不值得效仿
于是网上找到了一个.Net的控件,用在C#中用于编写滚动的动态波形效果还算不错.由于没有研究的过深,其性能并没有被我完全发挥出来.从网上抄了几段代码,没有进行优化,经过调试后功能还是能够实现的.可以供大家参考:
http://s6/middle/4b650d65g89db01ba89f5&690
上面是我做的一个Sample程序,至于绘图的性能还需要大家逐渐熟悉这个控件后自己来琢磨优化.
到网上可以下载到.net的控件.ZedGraph.dll.然后以控件的方式加载到C#中,对于熟悉C#的人应该不是问题.在我的程序中把这个控件的实例起名为zedGraphObj.接下来是我的Sample代码.
public
partial class StartForm : Form
{
public StartForm()
{
InitializeComponent();
InitZedGraph();
}
//----------------------------------------------------------------------------------------
public int InitZedGraph()
{
zedGraphObj.GraphPane.Title.Text="Eagle's ZedGraph";
zedGraphObj.GraphPane.XAxis.Title.Text = "mSecond";
zedGraphObj.GraphPane.YAxis.Title.Text = "mVoltage";
return 1;
}
//----------------------------------------------------------------------------------------
private void OnTest(object sender, EventArgs e)
{
double x, y1, y2;
PointPairList list1 = new PointPairList();
PointPairList list2 = new PointPairList();
Random ran = new Random();
//zedGraphObj.
for (int i = 0; i < 36; i++)
{
x = (double)i + 5;
y1 = 1.5 + Math.Sin((double)i * 0.2);
y2 = ran.NextDouble()*3;
list1.Add(x, y1);
list2.Add(x, y2);
}
//----------------------------------------------------------------
// 创建红色的菱形曲线
// 标记, 图中的 "Porsche"
LineItem myCurve = zedGraphObj.GraphPane.AddCurve("Porsche", list1,
Color.Red, SymbolType.None);
// 创建蓝色的圆形曲线
// 标记, 图中的
"Piper"
LineItem myCurve2 = zedGraphObj.GraphPane.AddCurve("Piper", list2,
Color.Blue, SymbolType.None);
// 在数据变化时绘制图形
zedGraphObj.GraphPane.AxisChange(this.CreateGraphics());
zedGraphObj.Invalidate();
ZedGraph.LineItem tLineItem =
(ZedGraph.LineItem)zedGraphObj.GraphPane.CurveList[0];
//----------------------------------------------------------------
for (int i = 36; i < 2000; i++)
{
if (list1.Count > 300)
{
list1.RemoveAt(0);
list2.RemoveAt(0);
}
x = (double)i + 5;
y1 = 1.5 + Math.Sin((double)i * 0.2);
y2 = ran.NextDouble()*3;
list1.Add(x, y1);
list2.Add(x, y2);
if (i % 5 == 0)
{
zedGraphObj.GraphPane.AxisChange(this.CreateGraphics());
zedGraphObj.Invalidate();
}
EagleApi.EagleWin32Api.Sleep_Egl(1);
}
}
}
最后达到的效果就是我的贴图中看到的效果.
加载中,请稍候......