MFC制作动态波形图( ChartCtrl)
1、创建工程
首先第一步,创建工程,这里我简单制作一个界面,主要用于展示效果,并将 ChartCtrl 所有的源码添加进工程当中。
https://cdn.jsdelivr.net/gh/zhongli0226/PicGoCDN/img/20250222161044.png
2. 创建控件
这里我们添加自定义控件“CustomCtrl”,并修改 style、class、ID 值。
Style : 0x52010000
Class : ChartCtrl
ID : IDC_CUSTOM_SHOW
3. 添加变量
先在 xxDlg.h 中引入头文件路径。
#include "ChartCtrl\ChartCtrl.h"
#include "ChartCtrl\ChartLineSerie.h"
#include "ChartCtrl\ChartAxis.h"
[!NOTE
]
注意这里,需要在工程中添加一下头文件路径在设置里找到如下,根据自己实际地址选择
4. 代码编写
.cpp
BEGIN_MESSAGE_MAP(CTabDlg_Data_Waveform, CDialogEx)ON_WM_TIMER() // 添加定时器消息
END_MESSAGE_MAP()//创建定时器消息回调接口
void CTabDlg::OnTimer(UINT_PTR nIDEvent)
{CDialogEx::OnTimer(nIDEvent);
}
2、创建坐标和画线
初始部分
//创建坐标xy标识
CChartAxis *pAxis = NULL;
pAxis = m_ChartCtrl.CreateStandardAxis(CChartCtrl::BottomAxis);
pAxis->SetAutomatic(true);
pAxis = m_ChartCtrl.CreateStandardAxis(CChartCtrl::LeftAxis);
pAxis->SetAutomatic(true);
m_pLineSerie = m_ChartCtrl.CreateLineSerie();
void CTabDlg_Data_Waveform::OnTimer(UINT_PTR nIDEvent)
{++m_count;m_pLineSerie->ClearSerie();LeftMoveArray(m_HightSpeedChartArray, PIONT_LENGTH, randf(0, 10));LeftMoveArray(m_X, PIONT_LENGTH, m_count);m_pLineSerie->AddPoints(m_X, m_HightSpeedChartArray, PIONT_LENGTH);CDialogEx::OnTimer(nIDEvent);
}///
/// \brief 左移数组
/// \param ptr 数组指针
/// \param data 新数值
///
void CTabDlg_Data_Waveform::LeftMoveArray(double* ptr, size_t length, double data)
{for (size_t i = 1; i < length; ++i){ptr[i - 1] = ptr[i];}ptr[length - 1] = data;
}double CTabDlg_Data_Waveform::randf(double min, double max)
{int minInteger = (int)(min * 10000);int maxInteger = (int)(max * 10000);int randInteger = rand() * rand();int diffInteger = maxInteger - minInteger;int resultInteger = randInteger % diffInteger + minInteger;return resultInteger / 10000.0;
}
void CChartCtrldemoDlg::OnBnClickedButtonStart()
{// TODO: 在此添加控件通知处理程序代码KillTimer(0);ZeroMemory(&m_HightSpeedChartArray, sizeof(double) * PIONT_LENGTH);for (size_t i = 0; i < PIONT_LENGTH; ++i){m_X[i] = i;}m_count = PIONT_LENGTH;m_pLineSerie->ClearSerie();SetTimer(0, 0, NULL);
}void CChartCtrldemoDlg::OnBnClickedButtonStop()
{// TODO: 在此添加控件通知处理程序代码KillTimer(0);
}
在 .h 中类中声明函数
afx_msg void OnTimer(UINT_PTR nIDEvent);CChartCtrl m_ChartCtrl;CChartLineSerie* m_pLineSerie;double m_HightSpeedChartArray[2096];double m_X[2096];unsigned int m_count;const size_t PIONT_LENGTH;void LeftMoveArray(double* ptr, size_t length, double data);double randf(double min, double max);
https://gitee.com/hxs273992029/chart-ctrl.git