标题:关于high-speed Charting Control配置过程中一些问题(ChartCtrl新手向)vs2019+win10
最近要搞一个MFC画折线图的程序,网上看到一个人人推荐的插件,还可以用于商业,于是学习ing。本片主要介绍配置方法和配置中的一些问题。详细配置方法可以看大佬图文教程,这里就不喧宾夺主了,草草介绍。
注意事项
1.源文件包括头文件和cpp文件均在source文件中,想要自己编写画图,可以不用下载demo和说明文件,因为用处真的不大。
2.部分版本的source编译后还存在一个问题,函数声明不一致。我忘了是哪个函数了,解决办法是再cpp文件中把函数参数类型size_t改为unsigned,这样就和.h文件一致,没有问题了。
3.目前大部分使用较低版本的vs,按照大佬的教程不会有任何问题。由于本人使用vs2019,在某些地方需要修改。
下面介绍下我配置过程
(1)文件下载,建议GitHub下载,不收费。链接https://github.com/HongXG/ChartCtrl
(2)新建一个基于对话框的MFC应用,(建议起一个好找的名字,因为源文件很多),新建一个筛选器,命名为ChartCtrl,右键,添加新建项,选中source中文件。
(3)在工具箱中找到Custom Control,拖拽一个到界面,修改style为0x52010000,类为ChartCtrl。
(4)给刚拖拽的Custom Control控件添加变量,变量名m_chartctrl,变量类型CChartCtrl。
(5)在dlg.h中添加
#include"ChartCtrl/ChartCtrl.h"
在dlg.cpp中添加如下
#include “ChartCtrl/ChartCtrl.h”
(6)运行,报错,*是否忘记添加pch.h
由于高版本vs使用pch代替stdafx做编译头,而high-speed Charting Control使用较低vs编译的,使用stdafx,因此产生不一致。
**解决方法:**打开建立的ChartCtrl筛选器,修改每个.cpp文件把#include“stdafx”改为#include“pch.h”
改完后依旧标红,提示打不开pch.h。莫慌,只是编译器没反应过来,运行并不会报错。
(7)再次运行,没有错误,并且不会闪退,正常显示画图框,即为配置完成。
一、High-speed Charting Control
1.1 下载
1.2 添加到项目中
首先将资源中的Chart_source复制到工程文件夹中(可能不同的资源里面名字不一样,这个文件就是该工具分装好的头文件和源文件)
然后在工程中:项目-添加现有项-Chart_source文件夹全选添加
至此,已经完成了将资源添加进项目工程中
二、绘图测试
2.1 添加控件
High-speed Charting Control是基于Custom Control控件绘制,添加该控件后需要修改属性,主要有两处
(1)样式
将默认的0x50010000修改为0x52010000
(2)类
修改为ChartCtrl
2.2 编写程序
(1)在项目头文件(xxxDlg.h)中添加需要使用的库
#include "ChartCtrl_source\ChartCtrl.h" //曲线基本设置头文件
#include "ChartCtrl_source\ChartTitle.h" //曲线标题设置头文件
#include "ChartCtrl_source\ChartBarSerie.h" //柱状图头文件
// MyChartDlg.h: 头文件
//
2)在项目源文件(xxxDlg.cpp)中添加变量并绑定控件
注意绑定控件要在对话框类下的DoDataExchange中,不然无法显示
在xxxDlg.h的xxDlg中声明成员变量
CChartCtrl m_ChartCtrl; //这里的成员变量名称根据实际需要命名即可
public:
CChartCtrl m_ChartCtrl; //这里的成员变量名称根据实际需要命名即可
在xxxDlg.cpp
CChartCtrl m_ChartCtrl; //这里的成员变量名称根据实际需要命名即可
void CMyChartDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_CUSTOM1, m_ChartCtrl);
}
(3)初始化坐标轴以及标题
BOOL CMyChartDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != nullptr)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
//
//初始化坐标轴
CChartAxis* pAxis = NULL;
pAxis = m_ChartCtrl.CreateStandardAxis(CChartCtrl::BottomAxis); //底部坐标轴
//pAxis->SetAutomatic(true);
//根据具体数值自动调节坐标轴坐标,如果要固定坐标轴需要将其参数修改为false
pAxis->SetAutomatic(false);
pAxis->SetMinMax(0, 20); //固定x轴坐标为0-20
pAxis = m_ChartCtrl.CreateStandardAxis(CChartCtrl::LeftAxis); //左边坐标轴
pAxis->SetAutomatic(false);
pAxis->SetMinMax(0, 100); //固定y轴坐标为0-100
//添加标题
TChartString str1;
str1 = _T("High-speed Charting画图Demo");
m_ChartCtrl.GetTitle()->AddString(str1);
//设置颜色
m_ChartCtrl.GetTitle()->SetColor(RGB(255, 255, 255)); //标题字体白色
m_ChartCtrl.GetLeftAxis()->SetTextColor(RGB(255, 255, 255)); //左坐标轴白色
m_ChartCtrl.GetBottomAxis()->SetTextColor(RGB(255, 255, 255)); //底部坐标轴白色
m_ChartCtrl.SetBorderColor(RGB(255, 255, 255)); //边框颜色白色
m_ChartCtrl.SetBackColor(RGB(85, 85, 85)); //背景颜色深灰色
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
(4)绘制曲线
添加Button控件来启动定时器,定时器到时会自动更新绘图,参数给随机数
其中添加定时器的方法为:类向导-消息-添加WM_TIMER
//点击按钮启动定时器
void CMyChartDlg::OnBnClickedTimerStart()
{
// TODO: 在此添加控件通知处理程序代码
SetTimer(1, 1000, NULL); //启动定时器1,计时1s
}
//定时器到时自动执行
void CMyChartDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
switch (nIDEvent)
{
case 1: //定时器1到时
{
srand((unsigned int)time(NULL)); //产生随机数种子,包含头文件#include<ctime>
double X1Values[15], Y1Values[15];
for (int i = 0; i < 15; i++)
{
X1Values[i] = i;
Y1Values[i] = rand() % 100 + 1; //y坐标随机产生1~100
}
CChartBarSerie* pBarSerie3; //定义柱状图句柄
m_ChartCtrl.SetZoomEnabled(true);
m_ChartCtrl.RemoveAllSeries();//先清空
pBarSerie3 = m_ChartCtrl.CreateBarSerie(); //绑定绘图变量
pBarSerie3->SetSeriesOrdering(poNoOrdering);//设置为无序
pBarSerie3->SetPoints(X1Values, Y1Values, 15);
}
break;
default:
break;
}
CDialogEx::OnTimer(nIDEvent);
}
2.3 测试程序
(1)执行时会报错
这是因为VS2019做了优化,标准头文件从stdafx.h变为了pch.h,将High-speed Charting Control中.cpp的源文件的库文件修改过来即可