MFC制作动态波形图( ChartCtrl)

发布于:2025-06-27 ⋅ 阅读:(19) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到