原创
在VC++中用CMSChart实现实时曲线的绘制(实例)
2010-3-12 11:50
4592
4
4
分类:
测试测量
例子是在MFC中实现的:利用计时器每个一段时间产生一个随机数,并插入到曲线图中显示,如果图中的数据点大于30个,则在插入新数据的同时,删除下标最小的数据点。实时曲线图显示在对话框中。以下是三个主要的函数。函数一:初始化曲线图 void RealChartDlg::InitChart() { //设置标题 m_Chart.SetTitleText(LPCTSTR("实时曲线图"));//Title 为CString类型 //设置栈模式 m_Chart.SetStacking(FALSE); //设置行数及列数 m_Chart.SetRowCount(1);//iRowCount和iColumnCount为int型 m_Chart.SetColumnCount(1); m_Chart.SetRow(1); m_Chart.SetRowLabel(""); m_Chart.GetDataGrid().SetData(1, 1, 0, 0); //设置x轴及y轴的标题。xTitle和yTitle为CString型 VARIANT var; m_Chart.GetPlot().GetAxis(0,var).GetAxisTitle().SetText("Time"); //x轴 m_Chart.GetPlot().GetAxis(1,var).GetAxisTitle().SetText("DataValue"); //y轴 //设置控件类型 m_Chart.SetChartType(3);//3:曲线型;1:条形;14:饼图 //设置背景颜色 m_Chart.GetBackdrop().GetFill().SetStyle(1); m_Chart.GetBackdrop().GetFill().GetBrush().GetFillColor().Set(255, 255, 255); //设置数据系列的颜色:如果是曲线图则对应每条曲线的颜色 for (int i = 1; i <= m_Chart.GetColumnCount(); i++ ) {//这里设置为随机颜色 m_Chart.GetPlot().GetSeriesCollection().GetItem(i).GetPen().GetVtColor().Set(rand() * 230 / RAND_MAX, rand() * 230 / RAND_MAX, rand() * 230 / RAND_MAX); m_Chart.GetPlot().GetSeriesCollection().GetItem(i).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1); } //设置x轴的其他属性 m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetAuto(FALSE); // 不自动标注X轴刻度 m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetDivisionsPerLabel(1);// 每刻度一个标注 m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetDivisionsPerTick(1); // 每刻度一个刻度线 //不自动标注y轴 m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetAuto(FALSE); m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMaximum(100); // y轴最大刻度为100 m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMinimum(0); // y轴最小刻度为0 m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMajorDivision(5); // 将y轴刻度5等分 m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMinorDivision(1); // 每刻度一个刻度线 // m_Chart.GetPlot().GetAxis(1,var).GetAxisTitle().SetText("YourTitle"); // y的轴名称 //不要与x轴垂直的表格线 m_Chart.GetPlot().GetAxis(0,var).GetAxisGrid().GetMajorPen().SetStyle(0);// no x grids //隐藏第二y轴,即右边的y轴 m_Chart.GetPlot().GetAxis(2,var).GetAxisScale().SetHide(TRUE); //刷新控件 } 函数二:启动计时器 void RealChartDlg::OnStart() { // TODO: Add your control notification handler code here m_nTimer = SetTimer(100, 100, NULL);//1/10 second ASSERT(m_nTimer != 0); GetDlgItem(IDC_START)->EnableWindow(FALSE);//禁用start按钮 } 函数三:产生数据,插入数据点,或删除下标最小的数据点 void RealChartDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default int nYValue = rand()%100; nCount++; CString str; int i; i = nCount; str.Format("%d", i); int inPos = m_Chart.GetRowCount() + 1; m_Chart.GetDataGrid().InsertRows(inPos, 1); m_Chart.SetRow(inPos); m_Chart.SetRowLabel(str);//sLabel为CString型 m_Chart.GetDataGrid().SetData(inPos, 1, nYValue, 0); if (nCount > 30) { m_Chart.GetDataGrid().DeleteRows(inPos - 30, 1); } m_Chart.Refresh(); //每产生30个数据便停止计时并启用start按钮,再点击一下即可以继续产生下30个数据 if (nCount % 30 == 0) { KillTimer(m_nTimer); GetDlgItem(IDC_START)->EnableWindow(TRUE);// } CDialog::OnTimer(nIDEvent); } 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/qlping2007/archive/2008/03/22/2207353.aspx
文章评论(0条评论)
登录后参与讨论