MFC---CMSChart画柱状图或折线图

本文介绍如何使用MSChart控件绘制包含三条曲线的图表,包括设置标题、图例、坐标轴、曲线颜色和宽度等步骤,并展示了如何填充数据到图表中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果:
这里写图片描述

安装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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值