在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);
}