2.2 AddArray函数-真正实现快速画图函数
为了验证AddArray的快速性, 添加了一个按钮:
按钮依然实现画图,不过是用AddArray函数 利用COleSafeArray实现数据存储 实现代码如下:
void CTeeChartDlg::OnBnClickedButtondraw2() {
CSeriesChartSpeed = (CSeries)m_Chart.Series(0); UpdateData(TRUE); if (m_nPointNum<=0) {
MessageBox(_T(\数据点数不能小于0\)); return;
}
DWORD dwTimeS,dwTimeE; CString str(_T(\)); long i(0); double val;
COleSafeArrayXValues; COleSafeArrayYValues;
DWORD pNumElements[] = {m_nPointNum}; XValues.Create(VT_R8, 1, pNumElements); YValues.Create(VT_R8, 1, pNumElements); for(i=0; i XValues.PutElement(&i, &val); val = randf(-20,20); YValues.PutElement(&i, &val); }; //由于需要计算时间,画图就不在第一个for循环里实现了 dwTimeS = GetTickCount(); ChartSpeed.Clear(); ChartSpeed.AddArray(m_nPointNum,YValues,XValues); dwTimeE = GetTickCount(); dwTimeE -= dwTimeS; str.Format(_T(\耗时:%d ms\),dwTimeE); SetDlgItemText(IDC_STATIC_T,str); } 效果如何? 看图 快30倍,1638400个点瞬间完成 一般我们的数据经常是用double数组保存的,很少用COleSafeArray所以,为了方便,可以写一个函数方便画图 如下: void DrawLine(double* pX,double* pY,long nNum) { COleSafeArrayXValues; COleSafeArrayYValues; long i(0); DWORD wLength = nNum; XValues.Create(VT_R8, 1, &wLength); YValues.Create(VT_R8, 1, &wLength); for(i=0; i XValues.PutElement(&i, pX+i); YValues.PutElement(&i, pY+i); } CSeries Chart = (CSeries)m_Chart.Series(0); Chart.Clear(); Chart.AddArray(nNum,YValues,XValues); } 调用时只要把数组的首地址和长度传进去就行了。 1. 1 添加TeeChart控件,给控件添加变量m_TeeChart 添加TeeChart控件,右击控件,选择添加变量,vs会自动给我们引入CTchart1这个类,但是只有这个类,我们是远远不够的,需要添加teechart其他相关的类,添加方法在之前已经讲过,不再重复。 1.2. 引入必要的头文件