[MFC] 1. TeeChart的安装与使用
环境:VS2017 + TeeChart5
由于毕设被迫需要使用MFC来设计程序(这显然是个很糟糕的选择),在安装与使用TeeChart插件时出现了许多问题。在2023年间我们尝试去使用1992年的技术时出现了各问题,而且这些技术正在被逐渐淘汰,相关的技术文章也并不充分。[MFC]系列将用于记录我毕设期间所遇到的难点问题,向这一古老且经典的技术示以崇高的敬意!
TeeChart安装文件以及示例项目工程文件(密码:7dve)
1-1 安装TeeChart
解压TeeChart.Pro.v5.ActiveX.7z文件,打开安装程序,使用sn.txt中的License和Password
默认安装位置C:\Program Files (x86)\TeeChart Pro v5 ActiveX Control
其余步骤按提示进行。
安装完成之后在windows搜索输入cmd,选择以管理员方式打开。
依次输入(文件路径为TeeChart安装路径)
cd C:\Program Files (x86)\TeeChart Pro v5 ActiveX Control
regsvr32 TeeChart5.ocx
当出现如下提示即为安装成功
1-2 在VS中插入控件
打开VS2017 -> 新建MFC项目 -> 选择基于对话框 -> 完成
在标题栏点击工具 -> 选择工具箱
在COM组件中选择TeeChart Pro Activex Control v5
在工具箱中添加TeeChart Pro Activex control v5和一个按钮,并适当调整位置大小
1-3 添加类与变量
右击项目名称 -> 类向导
选择添加类型库中的MFC类
可用类型库选择TeeChart Pro Activex Control v5<1.0>,在接口中选择ISeries和ITChart。点击完成后头文件中会生成CSeries.h和CTChart.h两个头文件。
分别打开这两个头文件并分别对其中的第三行代码添加//,将其注释掉
//#import "C:\\WINDOWS\\SysWow64\\TeeChart5.ocx" no_namespace
右击插入的TeeChart控件,选择添加变量
名称输入为m_chart,变量类型为CTChart1。点击完成之后头文件中新生成了一个COCX.h的头文件
然而这个COCX.h文件并不完整,我们需要在其中插入一些方法,代码如下
点击查看代码
// ITChart 方法
public:
LPDISPATCH get_Aspect()
{
LPDISPATCH result;
InvokeHelper(0x1, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, nullptr);
return result;
}
LPDISPATCH get_Axis()
{
LPDISPATCH result;
InvokeHelper(0x2, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, nullptr);
return result;
}
LPDISPATCH get_Canvas()
{
LPDISPATCH result;
InvokeHelper(0x3, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, nullptr);
return result;
}
BOOL get_ClipPoints()
{
BOOL result;
InvokeHelper(0x4, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, nullptr);
return result;
}
void put_ClipPoints(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL;
InvokeHelper(0x4, DISPATCH_PROPERTYPUT, VT_EMPTY, nullptr, parms, newValue);
}
short get_Cursor()
{
short result;
InvokeHelper(0x5, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, nullptr);
return result;
}
void put_Cursor(short newValue)
{
static BYTE parms[] = VTS_I2;
InvokeHelper(0x5, DISPATCH_PROPERTYPUT, VT_EMPTY, nullptr, parms, newValue);
}
short get_DragCursor()
{
short result;
InvokeHelper(0x6, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, nullptr);
return result;
}
void put_DragCursor(short newValue)
{
static BYTE parms[] = VTS_I2;
InvokeHelper(0x6, DISPATCH_PROPERTYPUT, VT_EMPTY, nullptr, parms, newValue);
}
long get_DragMode()
{
long result;
InvokeHelper(0x7, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, nullptr);
return result;
}
void put_DragMode(long newValue)
{
static BYTE parms[] = VTS_I4;
InvokeHelper(0x7, DISPATCH_PROPERTYPUT, VT_EMPTY, nullptr, parms, newValue);
}
BOOL get_Enabled()
{
BOOL result;
InvokeHelper(0x8, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, nullptr);
return result;
}
void put_Enabled(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL;
InvokeHelper(0x8, DISPATCH_PROPERTYPUT, VT_EMPTY, nullptr, parms, newValue);
}
LPDISPATCH get_Export()
{
LPDISPATCH result;
InvokeHelper(0x9, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, nullptr);
return result;
}
LPDISPATCH get_Footer()
{
LPDISPATCH result;
InvokeHelper(0xa, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, nullptr);
return result;
}
LPDISPATCH get_Frame()
{
LPDISPATCH result;
InvokeHelper(0xb, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, nullptr);
return result;
}
LPDISPATCH get_Header()
{
LPDISPATCH result;
InvokeHelper(0x16, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, nullptr);
return result;
}
long get_Height()
{
long result;
InvokeHelper(0xc, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, nullptr);
return result;
}
void put_Height(long newValue)
{
static BYTE parms[] = VTS_I4;
InvokeHelper(0xc, DISPATCH_PROPERTYPUT, VT_EMPTY, nullptr, parms, newValue);
}
LPDISPATCH get_Import()
{
LPDISPATCH result;
InvokeHelper(0xd, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, nullptr);
return result;
}
long get_Left()
{
long result;
InvokeHelper(0xe, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, nullptr);
return result;
}
void put_Left(long newValue)
{
static BYTE parms[] = VTS_I4;
InvokeHelper(0xe, DISPATCH_PROPERTYPUT, VT_EMPTY, nullptr, parms, newValue);
}
LPDISPATCH get_Legend()
{
LPDISPATCH result;
InvokeHelper(0xf, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, nullptr);
return result;
}
LPDISPATCH get_Page()
{
LPDISPATCH result;
InvokeHelper(0x10, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, nullptr);
return result;
}
LPDISPATCH get_Panel()
{
LPDISPATCH result;
InvokeHelper(0x11, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, nullptr);
return result;
}
LPDISPATCH get_Printer()
{
LPDISPATCH result;
InvokeHelper(0x12, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, nullptr);
return result;
}
LPDISPATCH get_Scroll()
{
LPDISPATCH result;
InvokeHelper(0x13, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, nullptr);
return result;
}
LPDISPATCH get_aSeries(long SeriesIndex)
{
LPDISPATCH result;
static BYTE parms[] = VTS_I4;
InvokeHelper(0x14, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, parms, SeriesIndex);
return result;
}
long get_SeriesCount()
{
long result;
InvokeHelper(0x15, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, nullptr);
return result;
}
long get_Top()
{
long result;
InvokeHelper(0x17, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, nullptr);
return result;
}
void put_Top(long newValue)
{
static BYTE parms[] = VTS_I4;
InvokeHelper(0x17, DISPATCH_PROPERTYPUT, VT_EMPTY, nullptr, parms, newValue);
}
BOOL get_Visible()
{
BOOL result;
InvokeHelper(0x18, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, nullptr);
return result;
}
void put_Visible(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL;
InvokeHelper(0x18, DISPATCH_PROPERTYPUT, VT_EMPTY, nullptr, parms, newValue);
}
LPDISPATCH get_Walls()
{
LPDISPATCH result;
InvokeHelper(0x19, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, nullptr);
return result;
}
long get_Width()
{
long result;
InvokeHelper(0x1a, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, nullptr);
return result;
}
void put_Width(long newValue)
{
static BYTE parms[] = VTS_I4;
InvokeHelper(0x1a, DISPATCH_PROPERTYPUT, VT_EMPTY, nullptr, parms, newValue);
}
LPDISPATCH get_Zoom()
{
LPDISPATCH result;
InvokeHelper(0x1b, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, nullptr);
return result;
}
void AboutBox()
{
InvokeHelper(DISPID_ABOUTBOX, DISPATCH_METHOD, VT_EMPTY, nullptr, nullptr);
}
long AddSeries(long SeriesClass)
{
long result;
static BYTE parms[] = VTS_I4;
InvokeHelper(0x1c, DISPATCH_METHOD, VT_I4, (void*)&result, parms, SeriesClass);
return result;
}
void ChangeSeriesType(long SeriesIndex, long NewSeriesType)
{
static BYTE parms[] = VTS_I4 VTS_I4;
InvokeHelper(0x1d, DISPATCH_METHOD, VT_EMPTY, nullptr, parms, SeriesIndex, NewSeriesType);
}
long CloneSeries(long SourceSeriesIndex)
{
long result;
static BYTE parms[] = VTS_I4;
InvokeHelper(0x1e, DISPATCH_METHOD, VT_I4, (void*)&result, parms, SourceSeriesIndex);
return result;
}
void Draw(long DC, long Left, long Top, long Right, long Bottom)
{
static BYTE parms[] = VTS_I4 VTS_I4 VTS_I4 VTS_I4 VTS_I4;
InvokeHelper(0x1f, DISPATCH_METHOD, VT_EMPTY, nullptr, parms, DC, Left, Top, Right, Bottom);
}
void ExchangeSeries(long Series1, long Series2)
{
static BYTE parms[] = VTS_I4 VTS_I4;
InvokeHelper(0x20, DISPATCH_METHOD, VT_EMPTY, nullptr, parms, Series1, Series2);
}
double GetDateTimeStep(long DateTimeStep)
{
double result;
static BYTE parms[] = VTS_I4;
InvokeHelper(0x21, DISPATCH_METHOD, VT_R8, (void*)&result, parms, DateTimeStep);
return result;
}
unsigned long GetFreeSeriesColor(BOOL CheckBackgroundColor)
{
unsigned long result;
static BYTE parms[] = VTS_BOOL;
InvokeHelper(0x22, DISPATCH_METHOD, VT_UI4, (void*)&result, parms, CheckBackgroundColor);
return result;
}
LPDISPATCH GetLabelsSeries(long DestAxis)
{
LPDISPATCH result;
static BYTE parms[] = VTS_I4;
InvokeHelper(0x23, DISPATCH_METHOD, VT_DISPATCH, (void*)&result, parms, DestAxis);
return result;
}
BOOL IsFreeSeriesColor(unsigned long AColor, BOOL CheckBackgroundColor)
{
BOOL result;
static BYTE parms[] = VTS_UI4 VTS_BOOL;
InvokeHelper(0x24, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, AColor, CheckBackgroundColor);
return result;
}
void RemoveAllSeries()
{
InvokeHelper(0x25, DISPATCH_METHOD, VT_EMPTY, nullptr, nullptr);
}
void RemoveSeries(long SeriesIndex)
{
static BYTE parms[] = VTS_I4;
InvokeHelper(0x26, DISPATCH_METHOD, VT_EMPTY, nullptr, parms, SeriesIndex);
}
void Repaint()
{
InvokeHelper(0x27, DISPATCH_METHOD, VT_EMPTY, nullptr, nullptr);
}
CString SeriesTitleLegend(long ASeriesIndex)
{
CString result;
static BYTE parms[] = VTS_I4;
InvokeHelper(0x28, DISPATCH_METHOD, VT_BSTR, (void*)&result, parms, ASeriesIndex);
return result;
}
void ShowEditor(long SeriesIndex)
{
static BYTE parms[] = VTS_I4;
InvokeHelper(0x29, DISPATCH_METHOD, VT_EMPTY, nullptr, parms, SeriesIndex);
}
void StopMouse()
{
InvokeHelper(0x2a, DISPATCH_METHOD, VT_EMPTY, nullptr, nullptr);
}
BOOL get_TimerEnabled()
{
BOOL result;
InvokeHelper(0x2b, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, nullptr);
return result;
}
void put_TimerEnabled(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL;
InvokeHelper(0x2b, DISPATCH_PROPERTYPUT, VT_EMPTY, nullptr, parms, newValue);
}
long get_TimerInterval()
{
long result;
InvokeHelper(0x2c, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, nullptr);
return result;
}
void put_TimerInterval(long newValue)
{
static BYTE parms[] = VTS_I4;
InvokeHelper(0x2c, DISPATCH_PROPERTYPUT, VT_EMPTY, nullptr, parms, newValue);
}
BOOL get_AutoRepaint()
{
BOOL result;
InvokeHelper(0x2d, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, nullptr);
return result;
}
void put_AutoRepaint(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL;
InvokeHelper(0x2d, DISPATCH_PROPERTYPUT, VT_EMPTY, nullptr, parms, newValue);
}
void EditOneSeries(long SeriesIndex)
{
static BYTE parms[] = VTS_I4;
InvokeHelper(0x2e, DISPATCH_METHOD, VT_EMPTY, nullptr, parms, SeriesIndex);
}
LPDISPATCH get_Environment()
{
LPDISPATCH result;
InvokeHelper(0x2f, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, nullptr);
return result;
}
long get_ChartLink()
{
long result;
InvokeHelper(0x30, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, nullptr);
return result;
}
LPDISPATCH get_MousePosition()
{
LPDISPATCH result;
InvokeHelper(0x31, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, nullptr);
return result;
}
void ChartRect(long Left, long Top, long Right, long Bottom)
{
static BYTE parms[] = VTS_I4 VTS_I4 VTS_I4 VTS_I4;
InvokeHelper(0x32, DISPATCH_METHOD, VT_EMPTY, nullptr, parms, Left, Top, Right, Bottom);
}
LPDISPATCH get_Tools()
{
LPDISPATCH result;
InvokeHelper(0x33, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, nullptr);
return result;
}
LPDISPATCH get_SubHeader()
{
LPDISPATCH result;
InvokeHelper(0x34, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, nullptr);
return result;
}
LPDISPATCH get_SubFooter()
{
LPDISPATCH result;
InvokeHelper(0x35, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, nullptr);
return result;
}
void ClearChart()
{
InvokeHelper(0x37, DISPATCH_METHOD, VT_EMPTY, nullptr, nullptr);
}
void RefreshData()
{
InvokeHelper(0x36, DISPATCH_METHOD, VT_EMPTY, nullptr, nullptr);
}
LPDISPATCH Series(long SeriesIndex)
{
LPDISPATCH result;
static BYTE parms[] = VTS_I4;
InvokeHelper(0x38, DISPATCH_METHOD, VT_DISPATCH, (void*)&result, parms, SeriesIndex);
return result;
}
1-4 设置图表
双击插入的TeeChart控件,点击ADD,选择fastline,取消勾选3D
双击添加的Button控件,进入OnBnClickedButton1()函数。在为该函数添加语句之前先为该文件添加两个头文件
#include "CSeries.h"
#include "CTChart.h"
然后在OnBnClickedButton1()函数中输入以下内容
void CChartDemoDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CSeries lineSeries = (CSeries)m_chart.Series(0);
lineSeries.Clear();
for (int i = 0; i < 50; i++)
lineSeries.AddXY((double)i, rand(), NULL, NULL);
}
最后就可以运行本地Windows调试器,点击Button1按钮得到下面实例结果