MFC画图的强大工具MSChart的使用

MFC画图的强大工具MSChart的使用

图表由于其直观明了的特性,在实际应用中十分很广泛。我们常常希望数据能通过图表来显示其特性。例如在DelphiC++Builder编程中,我们可以很方便地实现数据图表。MsChart6.05.0版)是Windows系统中Visual studio自带的一个ACTIVEX控件,它功能强大,应用广泛,具有以下特点:

·支持随机数据和随机数组,动态显示。 
·
支持所有主要的图表类型。 
·
支持三维显示。

下面是一个实例:

程序运行效果图

一、在工程中加入 mschart

菜单->Project->Add To Project->Components and Controls->Registered ActiveX Controls->Microsoft Chart Control, version 6.0 (OLEDB)

二、在CDemoView中加入:CMSChart m_Chart

三、创建及设置m_Chart

3.1 在 CDemoView::OnCreate 中创建CMSChart

1. // CDemoView::OnCreate()
2. CRect rc;
3. GetClientRect(&rc);
4. if(!m_Chart.Create("mschart", WS_CHILD| WS_VISIBLE, rc, this, 10))
5. return -1;

3.2 在 CDemoView::OnSize 中调整 m_Chart 的大小,使之能随窗口大小变化而变化

1. // CDemoView::OnSize
2. if( m_Chart.GetSafeHwnd() )
3. m_Chart.MoveWindow( 0, 0, cx, cy );

3.3 设置 m_Chart

01. void CDemoView::InitChart()
02. {
03. // 设置标题
04. m_Chart.SetTitleText("mschart 示例 by [email protected]");
05. // 下面两句改变背景色
06. m_Chart.GetBackdrop().GetFill().SetStyle(1);
07. m_Chart.GetBackdrop().GetFill().GetBrush().GetFillColor().Set(255, 255, 255);
08. // 显示图例
09. m_Chart.SetShowLegend(TRUE);
10. m_Chart.SetColumn(1);
11. m_Chart.SetColumnLabel((LPCTSTR)"1号机");
12. m_Chart.SetColumn(2);
13. m_Chart.SetColumnLabel((LPCTSTR)"2号机");
14. m_Chart.SetColumn(3);
15. m_Chart.SetColumnLabel((LPCTSTR)"3号机");
16. // 栈模式
17. // m_Chart.SetStacking(TRUE);
18. // Y轴设置
19. VARIANT var;
20. m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetAuto(FALSE); // 不自动标注Y轴刻度
21. m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMaximum(100); // Y轴最大刻度
22. m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMinimum(0); // Y轴最小刻度
23. m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMajorDivision(5); // Y轴刻度5等分
24. m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMinorDivision(1); // 每刻度一个刻度线
25. m_Chart.GetPlot().GetAxis(1,var).GetAxisTitle().SetText("小时"); // Y轴名称
26. // 3条曲线
27. m_Chart.SetColumnCount(3);
28. // 线色
29. m_Chart.GetPlot().GetSeriesCollection().GetItem(1).GetPen().GetVtColor().Set(0, 0, 255);
30. m_Chart.GetPlot().GetSeriesCollection().GetItem(2).GetPen().GetVtColor().Set(255, 0, 0);
31. m_Chart.GetPlot().GetSeriesCollection().GetItem(3).GetPen().GetVtColor().Set(0, 255, 0);
32. // 线宽(对点线图有效)
33. m_Chart.GetPlot().GetSeriesCollection().GetItem(1).GetPen().SetWidth(50);
34. m_Chart.GetPlot().GetSeriesCollection().GetItem(2).GetPen().SetWidth(100);
35. m_Chart.GetPlot().GetSeriesCollection().GetItem(3).GetPen().SetWidth(2);
36. // 数据点类型显示数据值的模式(对柱柱状图和点线图有效)
37. // 0: 不显示 1: 显示在柱状图外
38. // 2: 显示在柱状图内上方 3: 显示在柱状图内中间 4: 显示在柱状图内下方
39. m_Chart.GetPlot().GetSeriesCollection().GetItem(1).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1);
40. m_Chart.GetPlot().GetSeriesCollection().GetItem(2).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1);
41. m_Chart.GetPlot().GetSeriesCollection().GetItem(3).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1);
42. }

3.4 设置数据

01. void CDemoView::DrawChart()
02. {
03. int nRowCount = 6;
04. m_Chart.SetRowCount(nRowCount);
05. VARIANT var;
06.  
07. // 不自动标注X轴刻度
08. m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetAuto(FALSE);
09.  
10. // 每刻度一个标注
11. m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetDivisionsPerLabel(1);
12.  
13. // 每刻度一个刻度线
14. m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetDivisionsPerTick(1);
15.  
16. // X轴名称
17. m_Chart.GetPlot().GetAxis(0,var).GetAxisTitle().SetText("日期");
18. char buf[32];
19. srand( (unsigned)time( NULL ) );
20. for(int row = 1; row <= nRowCount; ++row)
21. {
22. m_Chart.SetRow(row);
23. sprintf(buf, "%d号", row);
24. m_Chart.SetRowLabel((LPCTSTR)buf);
25. m_Chart.GetDataGrid().SetData(row, 1, rand() * 100 / RAND_MAX, 0);
26. m_Chart.GetDataGrid().SetData(row, 2, rand() * 100 / RAND_MAX, 0);
27. m_Chart.GetDataGrid().SetData(row, 3, rand() * 100 / RAND_MAX, 0);
28. }
29. m_Chart.Refresh();
30. }

3.5 改变显示类型

01. // 折线图
02. void CDemoView::OnChartLine()
03. {
04. m_Chart.SetChartType(3);
05. DrawChart();
06. }
07.  
08. // 柱状图
09. void CDemoView::OnChartCombi()
10. {
11. m_Chart.SetChartType(1);
12. DrawChart();
13. }
14. // 饼状图
15. void CDemoView::OnChartPie()
16. {
17. m_Chart.SetChartType(14);
18. DrawChart();
19. }

发布了35 篇原创文章 · 获赞 17 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/shaopengf/article/details/38399355