最近项目中需要绘制图表(饼图、柱图),前段时间使用TeeChart,绘制的3D效果确实不错,由于TeeChart是商业版的,怕侵版权,呵呵!最后研究了下MSChart.虽说是2D的效果,但是功能也能实现.整理下对MSChart在MFC中一些常用的设置,方便以后其他绘图项目.
绘图控件:MSCHRT20.OCX 版本:6.0.81.77 注册方式:把MSCHRT20.OCX 最好拷贝到system32下面注册,点击“开始”-“运行(R)...”输入:regsvr32 MSCHRT20.OCX
注册成功后就可以在我们的工程下作图了.
1.打开VC6.0,选择“MFC AppWizard(exe)” 项目名称:MSChartDemo,选择“基于对话框”,点击OK完成.
2. Project--Add To Project--Components and Controls..---Registered ActiveX Controls---Microsoft Chart Control, version 6.0 (OLEDB)--Insert,根据自己的需要添加该控件所需的类,当然你也可以添加全部类.
3.把MSchart 控件拖到对话框上,调整位置,给该控件添加变量m_Chart。部分代码也是参考网上其它朋友的,代码如下:
#include "mschart.h"
#include "VcAxis.h"
#include "VcAxisTitle.h"
#include "VcAxisScale.h"
#include "VcBackdrop.h"
#include "VcBrush.h"
#include "VcCategoryScale.h"
#include "VcColor.h"
#include "VcDataGrid.h"
#include "VcDataPoint.h"
#include "VcDataPoints.h"
#include "VcDataPointLabel.h"
#include "VcFill.h"
#include "VcPen.h"
#include "VcPlot.h"
#include "VcSeries.h"
#include "VcSeriesCollection.h"
#include "VcTextLayout.h"
#include "VcValueScale.h"
void CMSChartDemoDlg::InitChart()
{
// 设置标题
m_Chart.SetTitleText("mschart示例");
// 下面两句改变背景色
m_Chart.GetBackdrop().GetFill().SetStyle(1);
m_Chart.GetBackdrop().GetFill().GetBrush().GetFillColor().Set(255, 255, 255);
//设置绘制列的个数,默认是5个,如果需要绘制多个柱形条,必须调用
m_Chart.SetColumnCount(ColumnCount);
// 显示图例
m_Chart.SetShowLegend(TRUE);
m_Chart.SetColumn(1);
m_Chart.SetColumnLabel((LPCTSTR)"1号机");
m_Chart.SetColumn(2);
m_Chart.SetColumnLabel((LPCTSTR)"2号机");
m_Chart.SetColumn(3);
m_Chart.SetColumnLabel((LPCTSTR)"3号机");
// 栈模式
m_Chart.SetStacking(FALSE);
// Y轴设置
VARIANT var;
m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetAuto(FALSE); // 不自动标注Y轴刻度
m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMaximum(100); // Y轴最大刻度
m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMinimum(0); // Y轴最小刻度
m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMajorDivision(5); // Y轴刻度5等分
m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMinorDivision(1); // 每刻度一个刻度线
m_Chart.GetPlot().GetAxis(1,var).GetAxisTitle().SetText("小时"); // Y轴名称
m_Chart.GetPlot().GetAxis(1,var).GetAxisTitle().GetTextLayout().SetOrientation(1);//设置Y轴标题的显示方向 0-代码水平 1-代表垂直 2-字头朝左 3-字头朝右
m_Chart.GetPlot().GetAxis(2,var).GetAxisScale().SetHide(TRUE); //隐藏右边的Y轴
#if 0
//线色(对点线图有效)
pMSchart->GetPlot().GetSeriesCollection().GetItem(1).GetPen().GetVtColor().Set(0, 0, 255);
pMSchart->GetPlot().GetSeriesCollection().GetItem(2).GetPen().GetVtColor().Set(255, 0, 0);
pMSchart->GetPlot().GetSeriesCollection().GetItem(3).GetPen().GetVtColor().Set(0, 255, 0);
//线宽(对点线图有效)
pMSchart->GetPlot().GetSeriesCollection().GetItem(1).GetPen().SetWidth(50);
pMSchart->GetPlot().GetSeriesCollection().GetItem(2).GetPen().SetWidth(100);
pMSchart->GetPlot().GetSeriesCollection().GetItem(3).GetPen().SetWidth(2);
#endif
// 数据点类型显示数据值的模式(对柱柱状图和点线图有效) 6: 数据显示在柱图、饼图外
m_Chart.GetPlot().GetSeriesCollection().GetItem(1).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(6);
m_Chart.GetPlot().GetSeriesCollection().GetItem(2).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(6);
m_Chart.GetPlot().GetSeriesCollection().GetItem(3).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(6);
//设置显示图形方式 1--柱图 14--饼图
m_Chart.SetChartType(1);
}
void CMSChartDemoDlg::DrawChart()
{
m_Chart.SetRowCount(1);
VARIANT var;
m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetAuto(FALSE); // 不自动标注X轴刻度
m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetDivisionsPerLabel(1);// 每刻度一个标注
m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetDivisionsPerTick(1); // 每刻度一个刻度线
// m_Chart.GetPlot().GetAxis(0,var).GetAxisTitle().SetText("日期"); // X轴名称
m_Chart.SetRow(1);
m_Chart.SetRowLabel(XAxisTitle);
//设置数据
m_Chart.GetDataGrid().SetData(1, 1, 33, 0);
m_Chart.GetDataGrid().SetData(1, 2, 33, 0);
m_Chart.GetDataGrid().SetData(1, 3, 33, 0);
//设置每个图形区域的颜色
m_Chart.GetPlot().GetSeriesCollection().GetItem(1).GetDataPoints().GetItem(-1).GetBrush().GetFillColor().Set(190,190,190);
m_Chart.GetPlot().GetSeriesCollection().GetItem(2).GetDataPoints().GetItem(-1).GetBrush().GetFillColor().Set(220,220,190);
m_Chart.GetPlot().GetSeriesCollection().GetItem(3).GetDataPoints().GetItem(-1).GetBrush().GetFillColor().Set(102,102,225);
//刷新
m_Chart.Refresh();
}