效果:
安装Teechart步骤省略。
右键窗体,选择“插入 ActiveX 控件”,选择:
头文件:
#include "VcPlot.h"
#include "VcAxis.h"
#include "VcValueScale.h"
#include "VcSeriesCollection.h"
#include "VcSeries.h"
#include "VcPen.h"
#include "VcCategoryScale.h"
#include "VcColor.h"
#include "VcDataGrid.h"
#include "VcBackdrop.h"
#include "VcFill.h"
#include "VcBrush.h"
#include "VcDataPoints.h"
#include "VcDataPoint.h"
#include "VcDataPointLabel.h"
#include "VcAxisTitle.h"
#include "math.h"
#include "mschart.h"
OnInitDialog中添加:
//设置标题
//m_Chart.SetTitleText(LPCTSTR("话务信息"));//Title 为CString类型
((CMSChart *)GetDlgItem(IDC_MSCHART1))->SetTitleText(LPCTSTR("话务信息"));//Title 为CString类型
//设置栈模式
((CMSChart *)GetDlgItem(IDC_MSCHART1))->SetStacking(FALSE);
// 显示图例
((CMSChart *)GetDlgItem(IDC_MSCHART1))->SetShowLegend(TRUE);
((CMSChart *)GetDlgItem(IDC_MSCHART1))->SetColumn(1);
((CMSChart *)GetDlgItem(IDC_MSCHART1))->SetColumnLabel((LPCTSTR)"话务量");
((CMSChart *)GetDlgItem(IDC_MSCHART1))->SetColumn(2);
((CMSChart *)GetDlgItem(IDC_MSCHART1))->SetColumnLabel((LPCTSTR)"拥塞率");
((CMSChart *)GetDlgItem(IDC_MSCHART1))->SetColumn(3);
((CMSChart *)GetDlgItem(IDC_MSCHART1))->SetColumnLabel((LPCTSTR)"半速率话务量比例");
//设置行数及列数
((CMSChart *)GetDlgItem(IDC_MSCHART1))->SetRowCount(10); //数据量组数
((CMSChart *)GetDlgItem(IDC_MSCHART1))->SetColumnCount(3); //3条曲线
//设置x轴及y轴的标题。xTitle和yTitle为CString型
VARIANT var;
((CMSChart *)GetDlgItem(IDC_MSCHART1))->GetPlot().GetAxis(0,var).GetAxisTitle().SetText("时间"); //x轴
((CMSChart *)GetDlgItem(IDC_MSCHART1))->GetPlot().GetAxis(1,var).GetAxisTitle().SetText("话务信息"); //y轴
//设置x轴的其他属性
((CMSChart *)GetDlgItem(IDC_MSCHART1))->GetPlot().GetAxis(0,var).GetCategoryScale().SetAuto(FALSE); // 不自动标注X轴刻度
((CMSChart *)GetDlgItem(IDC_MSCHART1))->GetPlot().GetAxis(0,var).GetCategoryScale().SetDivisionsPerLabel(1);// 每刻度一个标注
((CMSChart *)GetDlgItem(IDC_MSCHART1))->GetPlot().GetAxis(0,var).GetCategoryScale().SetDivisionsPerTick(1); // 每刻度一个刻度线
// Y轴设置
((CMSChart *)GetDlgItem(IDC_MSCHART1))->GetPlot().GetAxis(1,var).GetValueScale().SetAuto(FALSE); // 不自动标注Y轴刻度
((CMSChart *)GetDlgItem(IDC_MSCHART1))->GetPlot().GetAxis(1,var).GetValueScale().SetMaximum(40); // Y轴最大刻度
((CMSChart *)GetDlgItem(IDC_MSCHART1))->GetPlot().GetAxis(1,var).GetValueScale().SetMinimum(0); // Y轴最小刻度
((CMSChart *)GetDlgItem(IDC_MSCHART1))->GetPlot().GetAxis(1,var).GetValueScale().SetMajorDivision(2); // Y轴刻度2等分
((CMSChart *)GetDlgItem(IDC_MSCHART1))->GetPlot().GetAxis(1,var).GetValueScale().SetMinorDivision(1); // 每刻度一个刻度
// 线色
((CMSChart *)GetDlgItem(IDC_MSCHART1))->GetPlot().GetSeriesCollection().GetItem(1).GetPen().GetVtColor().Set(0, 0, 255);
((CMSChart *)GetDlgItem(IDC_MSCHART1))->GetPlot().GetSeriesCollection().GetItem(2).GetPen().GetVtColor().Set(255, 0, 0);
((CMSChart *)GetDlgItem(IDC_MSCHART1))->GetPlot().GetSeriesCollection().GetItem(3).GetPen().GetVtColor().Set(0, 255, 0);
// 线宽(对点线图有效)
((CMSChart *)GetDlgItem(IDC_MSCHART1))->GetPlot().GetSeriesCollection().GetItem(1).GetPen().SetWidth(40);
((CMSChart *)GetDlgItem(IDC_MSCHART1))->GetPlot().GetSeriesCollection().GetItem(2).GetPen().SetWidth(40);
((CMSChart *)GetDlgItem(IDC_MSCHART1))->GetPlot().GetSeriesCollection().GetItem(3).GetPen().SetWidth(40);
//设置控件类型
((CMSChart *)GetDlgItem(IDC_MSCHART1))->SetChartType(1);//3:折线图;1:柱状图;14:饼图
// 数据点类型显示数据值的模式(对柱柱状图和点线图有效)
// 0: 不显示 1: 显示在柱状图外
// 2: 显示在柱状图内上方 3: 显示在柱状图内中间 4: 显示在柱状图内下方
((CMSChart *)GetDlgItem(IDC_MSCHART1))->GetPlot().GetSeriesCollection().GetItem(1).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1);
//((CMSChart *)GetDlgItem(IDC_MSCHART1))->GetPlot().GetSeriesCollection().GetItem(2).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1);
((CMSChart *)GetDlgItem(IDC_MSCHART1))->GetPlot().GetSeriesCollection().GetItem(3).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1);
//刷新控件
((CMSChart *)GetDlgItem(IDC_MSCHART1))->Refresh();
“确定”按钮中添加:
///////////////////////////////////////////////////////////////////////////////////////////
//画线开始
GetDlgItem(IDC_MSCHART1)->ShowWindow(SW_SHOW);
int nRowCount = i-1;
((CMSChart *)GetDlgItem(IDC_MSCHART1))->SetRowCount(nRowCount);
char buf[20];
int row;
for(row = 1; row <= nRowCount; ++row)
{
((CMSChart *)GetDlgItem(IDC_MSCHART1))->SetRow(row);
sprintf(buf, "%d", hour[row]);
((CMSChart *)GetDlgItem(IDC_MSCHART1))->SetRowLabel((LPCTSTR)buf);
((CMSChart *)GetDlgItem(IDC_MSCHART1))->GetDataGrid().SetData(row, 1, avgTraff[row], 0); //设置第一条曲线的第row个点
((CMSChart *)GetDlgItem(IDC_MSCHART1))->GetDataGrid().SetData(row, 2, congsP[row], 0);//设置第二条曲线的第row个点
((CMSChart *)GetDlgItem(IDC_MSCHART1))->GetDataGrid().SetData(row, 3, thtraffP[row], 0);//设置第三条曲线的第row个点
}
((CMSChart *)GetDlgItem(IDC_MSCHART1))->Refresh();