| MFC扩展编程实例历史面积图表动态运行缩放 
 当前例程实现动态运行的历史面积图表创建与编写功能,
 顺带添加一个警示区域,用于指示图表预警范围。
 效果如下图。
 
 MFC扩展编程实例历史面积图表动态运行缩放   点击界面的启停按钮,可以让历史图表从右向左运动起来,每次启动,速度可设置。
 运动效果是通过启用定义器实现,通过定时器向图表添加数据可以让历史图表运行。
 定时器定时时间大小不同,可实现图表运动速度。
 
 点击缩放按钮可以缩小放大图表。
 最后一个按钮可以显示隐藏粉色预警区域。
 
 下面是例程实现过程。
 首先创建基于MFC扩展库的单文档工程,class CMy123View : public CBCGPFormView。
 在默认的对话框资源上添加图片控件,修改ID为IDC_CHART,用于显示图表。
 
 在视窗类添加变量
 CBCGPChartCtrl m_wndChart;
 double         m_dblLastVal;
 CBCGPChartRangeObject*        m_pRange;//警示区域;
 
 及虚函数Create,用于初始化变量。
 
 复制代码BOOL CMy123View::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
        BOOL bRst = CBCGPFormView::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);;
        m_dblLastVal = 0.0;
        //图表初始化;
        m_wndChart.SubclassDlgItem(IDC_CHART,this);        
        CBCGPInfoTipOptions infoTipOptions;
        infoTipOptions.m_StemLocation = CBCGPPopupWindow::BCGPPopupWindowStemLocation_Left;
        m_wndChart.EnableInfoTip(TRUE, &infoTipOptions);//显示提示文本;
        CBCGPChartVisualObject* pChart = m_wndChart.GetChart();//获取图表指针;
        pChart->SetChartType(BCGPChartArea);//设置图表类型;
        pChart->SetCurveType(BCGPChartFormatSeries::CCT_SPLINE);
        pChart->SetChartTitle(_T("历史面积图表"));//设置图表标题;
        pChart->SetSeriesShadow(true);//数据系列显示阴影;
        pChart->SetThemeOpacity(60);//设置透明度;
        CBCGPBrush brFill1(CBCGPColor::Pink, .3);
        m_pRange = pChart->AddChartRangeObject(50., 100., TRUE /* Horizontal */, brFill1);
        //创建一数据系列,添加数据;
        CBCGPChartSeries* pSeries = pChart->GetSeries(0);
        ASSERT_VALID(pSeries);
        pSeries->EnableHistoryMode(TRUE, 1000);//开启历史模式,最多数据点1000;
        pChart->AddChartData(m_dblLastVal);
        CBCGPChartAxis* pXAxis = pChart->GetChartAxis(BCGP_CHART_X_PRIMARY_AXIS);
        ASSERT_VALID(pXAxis);//X轴属性设置;
        pXAxis->m_axisLabelType = CBCGPChartAxis::ALT_NO_LABELS;
        pXAxis->m_majorTickMarkType = CBCGPChartAxis::TMT_NO_TICKS;
        //开启历史图表的固定间隔模式,像素宽度40对应数值10;
    int GRID_COLUMN_WIDTH = 40;
        int nValuesPerInterval = 4;
        pXAxis->SetFixedIntervalWidth(GRID_COLUMN_WIDTH, nValuesPerInterval);
        CBCGPChartAxis* pYAxis = pChart->GetChartAxis(BCGP_CHART_Y_PRIMARY_AXIS);
        ASSERT_VALID(pYAxis);//Y轴属性设置;
        int MAX_VAL=100;
        pYAxis->SetFixedDisplayRange(0., 100, 20.);//y轴数值范围与间隔;
        //添加添加到布局管理器统一管理布局;
        if (GetLayout() == NULL)
                return bRst;
        CBCGPStaticLayout* pLayout = (CBCGPStaticLayout*)GetLayout();
        if (pLayout == NULL)
                return bRst;
        pLayout->AddAnchor(m_wndChart.GetDlgCtrlID(), CBCGPStaticLayout::e_MoveTypeNone, CBCGPStaticLayout::e_SizeTypeBoth);
        //
        return bRst;
}
 由于有用于定时器,所以我们添加定时消息WM_TIME处理函数
 
 最后就是是三个按钮的点击函数实现。复制代码inline double Rand (double dblStart, double dblFinish)
{
        double minVal = min(dblStart, dblFinish);
        double maxVal = max(dblStart, dblFinish);
        return (maxVal - minVal) * (double)rand() / (RAND_MAX + 1) + minVal;
}
void CMy123View::OnTimer(UINT_PTR nIDEvent)
{
        CBCGPFormView::OnTimer(nIDEvent);
        CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
        ASSERT_VALID(pChart);
        //模拟动态生成随机数据,添加到历史图表;
        int MAX_VAL=100;//数据最大值;
        const double d = MAX_VAL / 25;
        const double dblDelta = Rand(-d, d);
        const double dblVal = min(MAX_VAL - 1, max(0., m_dblLastVal + dblDelta));
        m_dblLastVal = dblVal;
        pChart->AddChartData(dblVal);
        pChart->Redraw();
}
 例程使用到的MFC扩展库可以网站搜索下载。复制代码void CMy123View::OnBnClickedButton1()//记住图表
{
        static bool bStart=true;
        static int nSpeed=10;
        if(bStart)
        {        
                SetTimer(1, nSpeed, NULL);
                nSpeed+=300;
        }
        else
        {
                KillTimer(1);
        }
        nSpeed=nSpeed>600?10:nSpeed;
        bStart = !bStart;
}
void CMy123View::OnBnClickedButton3()//缩放图表;
{
        static int nValuesPerInterval=8;
        CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
        ASSERT_VALID(pChart);
        CBCGPChartAxis* pXAxis = pChart->GetChartAxis(BCGP_CHART_X_PRIMARY_AXIS);
        ASSERT_VALID(pXAxis);
        int GRID_COLUMN_WIDTH = 40;
        pXAxis->SetFixedIntervalWidth(GRID_COLUMN_WIDTH, nValuesPerInterval);
        nValuesPerInterval+=4;
        nValuesPerInterval = nValuesPerInterval>GRID_COLUMN_WIDTH?4:nValuesPerInterval;
        pChart->Redraw();
}
void CMy123View::OnBnClickedButton2()//自定义区域显示,隐藏;
{
        static bool bShow=false;
        m_pRange->SetVisible(bShow);
        CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
        ASSERT_VALID(pChart);
        pChart->Redraw();
        bShow = !bShow;
}
例程源代码下载地址:
 
 
   如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!    
 
   上位机VC MFC程序开发精典实例大全源码与视频讲解配套下载408例 经历1年的编程与录制点击进入查看 
 
 |