添加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;
}
}