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.}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章