在VC++中用CMSChart实现实时曲线的绘制(实例)

本文档介绍了如何在MFC应用程序中使用CMSChart库创建实时曲线图。通过设置计时器,每隔一定时间生成随机数据点并更新到图表中,当数据点超过30个时,会移除最旧的数据点,实现动态显示。主要涉及的函数包括初始化曲线图、启动计时器以及处理定时器事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

        本例子是在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);
}

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值