QQ登录

只需一步,快速开始

MFC扩展编程实例历史面积图表动态运行缩放

[ 复制链接 ]
MFC扩展编程实例历史面积图表动态运行缩放

当前例程实现动态运行的历史面积图表创建与编写功能,
顺带添加一个警示区域,用于指示图表预警范围。
效果如下图。

MFC扩展编程实例历史面积图表动态运行缩放

MFC扩展编程实例历史面积图表动态运行缩放

点击界面的启停按钮,可以让历史图表从右向左运动起来,每次启动,速度可设置。
运动效果是通过启用定义器实现,通过定时器向图表添加数据可以让历史图表运行。
定时器定时时间大小不同,可实现图表运动速度。

点击缩放按钮可以缩小放大图表。
最后一个按钮可以显示隐藏粉色预警区域。

下面是例程实现过程。
首先创建基于MFC扩展库的单文档工程,class CMy123View : public CBCGPFormView。
在默认的对话框资源上添加图片控件,修改ID为IDC_CHART,用于显示图表。

在视窗类添加变量
        CBCGPChartCtrl m_wndChart;
        double         m_dblLastVal;
        CBCGPChartRangeObject*        m_pRange;//警示区域;

及虚函数Create,用于初始化变量。
  1. BOOL CMy123View::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
  2. {
  3.         BOOL bRst = CBCGPFormView::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);;
  4.         m_dblLastVal = 0.0;
  5.         //图表初始化;
  6.         m_wndChart.SubclassDlgItem(IDC_CHART,this);       
  7.         CBCGPInfoTipOptions infoTipOptions;
  8.         infoTipOptions.m_StemLocation = CBCGPPopupWindow::BCGPPopupWindowStemLocation_Left;
  9.         m_wndChart.EnableInfoTip(TRUE, &infoTipOptions);//显示提示文本;
  10.         CBCGPChartVisualObject* pChart = m_wndChart.GetChart();//获取图表指针;
  11.         pChart->SetChartType(BCGPChartArea);//设置图表类型;
  12.         pChart->SetCurveType(BCGPChartFormatSeries::CCT_SPLINE);
  13.         pChart->SetChartTitle(_T("历史面积图表"));//设置图表标题;
  14.         pChart->SetSeriesShadow(true);//数据系列显示阴影;
  15.         pChart->SetThemeOpacity(60);//设置透明度;
  16.         CBCGPBrush brFill1(CBCGPColor::Pink, .3);
  17.         m_pRange = pChart->AddChartRangeObject(50., 100., TRUE /* Horizontal */, brFill1);
  18.         //创建一数据系列,添加数据;
  19.         CBCGPChartSeries* pSeries = pChart->GetSeries(0);
  20.         ASSERT_VALID(pSeries);
  21.         pSeries->EnableHistoryMode(TRUE, 1000);//开启历史模式,最多数据点1000;
  22.         pChart->AddChartData(m_dblLastVal);
  23.         CBCGPChartAxis* pXAxis = pChart->GetChartAxis(BCGP_CHART_X_PRIMARY_AXIS);
  24.         ASSERT_VALID(pXAxis);//X轴属性设置;
  25.         pXAxis->m_axisLabelType = CBCGPChartAxis::ALT_NO_LABELS;
  26.         pXAxis->m_majorTickMarkType = CBCGPChartAxis::TMT_NO_TICKS;
  27.         //开启历史图表的固定间隔模式,像素宽度40对应数值10;
  28.     int GRID_COLUMN_WIDTH = 40;
  29.         int nValuesPerInterval = 4;
  30.         pXAxis->SetFixedIntervalWidth(GRID_COLUMN_WIDTH, nValuesPerInterval);
  31.         CBCGPChartAxis* pYAxis = pChart->GetChartAxis(BCGP_CHART_Y_PRIMARY_AXIS);
  32.         ASSERT_VALID(pYAxis);//Y轴属性设置;
  33.         int MAX_VAL=100;
  34.         pYAxis->SetFixedDisplayRange(0., 100, 20.);//y轴数值范围与间隔;
  35.         //添加添加到布局管理器统一管理布局;
  36.         if (GetLayout() == NULL)
  37.                 return bRst;
  38.         CBCGPStaticLayout* pLayout = (CBCGPStaticLayout*)GetLayout();
  39.         if (pLayout == NULL)
  40.                 return bRst;
  41.         pLayout->AddAnchor(m_wndChart.GetDlgCtrlID(), CBCGPStaticLayout::e_MoveTypeNone, CBCGPStaticLayout::e_SizeTypeBoth);
  42.         //
  43.         return bRst;
  44. }
复制代码


由于有用于定时器,所以我们添加定时消息WM_TIME处理函数
  1. inline double Rand (double dblStart, double dblFinish)
  2. {
  3.         double minVal = min(dblStart, dblFinish);
  4.         double maxVal = max(dblStart, dblFinish);
  5.         return (maxVal - minVal) * (double)rand() / (RAND_MAX + 1) + minVal;
  6. }
  7. void CMy123View::OnTimer(UINT_PTR nIDEvent)
  8. {
  9.         CBCGPFormView::OnTimer(nIDEvent);

  10.         CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
  11.         ASSERT_VALID(pChart);
  12.         //模拟动态生成随机数据,添加到历史图表;
  13.         int MAX_VAL=100;//数据最大值;
  14.         const double d = MAX_VAL / 25;
  15.         const double dblDelta = Rand(-d, d);
  16.         const double dblVal = min(MAX_VAL - 1, max(0., m_dblLastVal + dblDelta));

  17.         m_dblLastVal = dblVal;
  18.         pChart->AddChartData(dblVal);
  19.         pChart->Redraw();
  20. }
复制代码
最后就是是三个按钮的点击函数实现。
  1. void CMy123View::OnBnClickedButton1()//记住图表
  2. {
  3.         static bool bStart=true;
  4.         static int nSpeed=10;
  5.         if(bStart)
  6.         {       
  7.                 SetTimer(1, nSpeed, NULL);
  8.                 nSpeed+=300;
  9.         }
  10.         else
  11.         {
  12.                 KillTimer(1);
  13.         }
  14.         nSpeed=nSpeed>600?10:nSpeed;
  15.         bStart = !bStart;
  16. }

  17. void CMy123View::OnBnClickedButton3()//缩放图表;
  18. {
  19.         static int nValuesPerInterval=8;
  20.         CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
  21.         ASSERT_VALID(pChart);
  22.         CBCGPChartAxis* pXAxis = pChart->GetChartAxis(BCGP_CHART_X_PRIMARY_AXIS);
  23.         ASSERT_VALID(pXAxis);
  24.         int GRID_COLUMN_WIDTH = 40;
  25.         pXAxis->SetFixedIntervalWidth(GRID_COLUMN_WIDTH, nValuesPerInterval);

  26.         nValuesPerInterval+=4;
  27.         nValuesPerInterval = nValuesPerInterval>GRID_COLUMN_WIDTH?4:nValuesPerInterval;
  28.         pChart->Redraw();
  29. }


  30. void CMy123View::OnBnClickedButton2()//自定义区域显示,隐藏;
  31. {
  32.         static bool bShow=false;
  33.         m_pRange->SetVisible(bShow);
  34.         CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
  35.         ASSERT_VALID(pChart);
  36.         pChart->Redraw();
  37.         bShow = !bShow;
  38. }
复制代码
例程使用到的MFC扩展库可以网站搜索下载。
例程源代码下载地址:
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:36.MFC扩展编程实例历史面积图表动态运行缩放.rar 
文件大小:81.06 KB  售价:3金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我


  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  

  

上位机VC MFC程序开发精典实例大全源码与视频讲解配套下载408例

  

经历1年的编程与录制点击进入查看



回复

使用道具 举报

点击查看
快速回复 返回列表 客服中心 搜索