添加ChartCtrl库
ChartCtrl需要从网上下载,将整个文件夹复制到工作路径下,在此不做详细介绍。
首先在交互界面中添加控件Custom Control,修改style= 0x52010000、class=ChartCtrl、控件ID
控件ID可自己修改
注意在Class里面一定要加上ChartCtrl,不写的话程序会直接退出来.
在dlg中的h里面添加
#include "Include/ChartCtrl/ChartCtrl.h"
#include "Include/ChartCtrl/ChartTitle.h"
#include "Include/ChartCtrl/ChartLineSerie.h"
#include "Include/ChartCtrl/ChartAxisLabel.h"
在.h中定义一个CChartCtrl类和一个定时器函数
CChartCtrl m_ChartCtrl1;
CChartLineSerie *pLineSerie1;
CChartAxis *pAxisBottom;
CChartAxis *pAxisLeft;
void DataShow(double *xb,double *yb,int len);
在cpp中添加定义
#define DATA_SHOW_LENGHT 2000 //总共显示的点个数
#define DATA_UPDATE_LENGHT 10 //每次更新的点个数
double xBuff[DATA_SHOW_LENGHT] = { 0 };
double yBuff[DATA_SHOW_LENGHT] = { 0 };
将控件绑定到定义的CChartCtrl m_ChartCtrl1中
void CtestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX,IDC_CUSTOM_CHART,m_ChartCtrl1);
}
BEGIN_MESSAGE_MAP(CtestDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_TIMER()
END_MESSAGE_MAP()
在BOOL CtestDlg::OnInitDialog()中加入
pAxisBottom= NULL;
pAxisBottom = m_ChartCtrl1.CreateStandardAxis(CChartCtrl::BottomAxis);
pAxisBottom->SetMinMax(0,200);
pAxisLeft=NULL;
pAxisLeft = m_ChartCtrl1.CreateStandardAxis(CChartCtrl::LeftAxis);
pAxisLeft->SetMinMax(-3,3);
TChartString str;
str= _T("曲线图");
m_ChartCtrl1.GetTitle()->AddString(str);
CChartAxisLabel* pLabel = NULL;
CChartAxis *pAxis = NULL;
TChartString str1 = _T("左坐标轴");
pAxis = m_ChartCtrl1.GetLeftAxis();
if(pAxis)
pLabel = pAxis->GetLabel();
if(pLabel)
pLabel->SetText(str1);
str1 = _T("数值坐标轴");
pAxis = m_ChartCtrl1.GetBottomAxis();
if(pAxis)
pLabel = pAxis->GetLabel();
if(pLabel)
pLabel->SetText(str1);
m_ChartCtrl1.EnableRefresh(false);
//显示点数据包初始化
for (int i = 0; i < DATA_SHOW_LENGHT; i++) {
xBuff[i] = i;
yBuff[i] = sin( float(rand()/10+i));
yBuff2[i] = rand() % 360;
}
void CtestDlg::DataShow(double *xb, double *yb, int len)
{
CChartLineSerie *pLineSerie;
pLineSerie = m_ChartCtrl1.CreateLineSerie();
pLineSerie->SetSeriesOrdering(poNoOrdering);//设置为无序
pLineSerie->AddPoints(xb, yb, len);
UpdateWindow();
m_ChartCtrl1.EnableRefresh(true);
}
void CtestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
if (!m_bNeedStop)
{
SetTimer(1,100,NULL);
m_bNeedStop=true;
}
else
KillTimer(1);
}
void CtestDlg::OnTimer(UINT nIDEvent){
m_ChartCtrl1.EnableRefresh(false);
m_ChartCtrl1.RemoveAllSeries();
m_ChartCtrl1.EnableRefresh(true);
static int offset = 0;
pAxisBottom->SetMinMax(offset,200+offset);
for (int m = 0; m <DATA_SHOW_LENGHT-1; m++)
{
xBuff[m] = xBuff[m+1];
yBuff[m] = yBuff[m+1];
}
xBuff[DATA_SHOW_LENGHT-1]=200+offset;
yBuff[DATA_SHOW_LENGHT-1] =sin( float(rand()/10+200+offset-1));
DataShow(xBuff, yBuff, DATA_SHOW_LENGHT);
offset++;
if (offset > 10000)
{
offset = 0;
}
}