您的位置:首页 > 编程语言 > C语言/C++

VS2013 TeeChart_v5 MFC C++ 使用手册干货(二)TeeChart 实时数据图表

2019-01-16 15:47 1461 查看
版权声明:全部内容仅供学习交流,如需转载请注明出处! https://blog.csdn.net/a897297499/article/details/86504943

在MFC中,要想用TeeChart实现对数据的实时可视化,则需要借助c++中的定时器。关于定时器的具体内容可以在鸡啄米的MFC教程中查看(感谢大神,同时鸡啄米的MFC入门教程也非常棒!我也是看他入得门):
鸡啄米MFC常用类:c++定时器

那么下面直接上东西了:

首先当然是按照上一篇文章中的方法添加TeeChart以及引入相关类,然后需要两部来实现数据显示的实时化。

一、为MFC添加定时器消息处理函数

选择项目,类向导,然后选择自己的对话框类,选择消息,找到定时器消息WM_TIMER,点击添加处理程序,
出现OnTimer后点击确定。

完成之后再对话框类中应该可以看到如下代码

void CBULABULADlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO:  在此添加消息处理程序代码和/或调用默认值

CDialogEx::OnTimer(nIDEvent);
}

到这里就完成了Timer定时器消息处理函数的添加

二、写入实时数据显示程序

1.在界面上添加一个按钮Start,IDC_BUTTONSTART。
2.在按钮的消息处理函数中写入以下代码

void CBULABULADlg::OnBnClickedButtonstrat()
{
SetTimer(1,1000,NULL);//SetTimer(定时器标识符 , 定时器间隔(ms) , 定时器回调函数)
}

3.在ontimer中写入绘图函数

void CBULABULADlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO:  在此添加消息处理程序代码和/或调用默认值
switch (nIDEvent)
{
case 1: //定时器1从这里开始执行,当有多个定时器时,根据不同的定时器标识可以使其执行不同的任务
{
CSeries my_series = m_chart.Series(0); //此处为刚刚添加的series序号
my_series.Clear();                     //清除上一次的图线
srand((unsigned)time(NULL));           //设置随机数种子
double y;                              //y坐标
for (int x = 0; x < 100; x++)          //画100个点
{
//如果需要实时显示采集到的数据,那么把得到的
//数据与x,y做替换
y = rand() % 100;  // y = 随机数
my_series.AddXY(x, y, NULL, NULL);  //添加点到图线
}
break;
}
}
CDialogEx::OnTimer(nIDEvent);
}

这就是使用Timer定时器实现实时绘图的方法了。

一般这种程序多用于数据采集程序的实时可视化,因此在这里提出一点补充,即对于大数据量下的数据实时绘制方法

1.图表设置上的方法


双击teechart图表,选择Series选项卡,选择你的图线(这里是Series0),把DrawAll的钩去掉。这样Teechart就会在不改变图线形状的情况下自动减少绘制点数,从而加快绘图。

2.调用AddArray函数绘制

Teechart提供了AddArray函数以应对大数据量情况下的绘图,AddArray的函数声明如下

void AddArray(long ArraySize, VARIANT& YArray, VARIANT& XArray);

从左到右的参数分别为绘制点数,y坐标序列,x坐标序列
使用的方法为:

void CxxxDlg::TeeChartPaint(int order, double dData[]) //order为想要绘制的图线的序号, dData[]为存储了y值的数组
{
COleSafeArray XValues;
COleSafeArray YValues;
int nDATALENGTH = 10000;  //绘制点数
DWORD numElements[] = { nDATALENGTH };
// Create a safe array
XValues.Create(VT_R8, 1, numElements);
YValues.Create(VT_R8, 1, numElements);
// Initialization
long i;
double dval;
for (i = 0; i<nDATALENGTH; i++)
{
dval = i;
XValues.PutElement(&i, &dval);
dval = dData[i];
YValues.PutElement(&i, &dval);
//YValues.PutElement(&i, dData+i);
};
CSeries lineSeries = (CSeries)m_tchart.Series(order);
lineSeries.Clear();
lineSeries.AddArray(nDATALENGTH, YValues, XValues);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: