1.前期準備
具體可見VS2010 使用TeeChart繪圖控件 - 之一 控件和類的導入
1. 1 添加TeeChart控件,給控件添加變量m_TeeChart
添加TeeChart控件,右擊控件,選擇添加變量,vs會自動給我們引入CTchart1這個類,但是隻有這個類,我們是遠遠不夠的,需要添加teechart其他相關的類,添加方法在之前已經講過,不再重複。
1.2. 引入必要的頭文件
其實之前的方法比較麻煩,更簡單就是通過類嚮導,導入類型庫的類如圖進入類嚮導,選擇添加類按鈕的下拉菜單,選擇類型庫中的MFC類
暫時引入
#include "CSeries.h"
#include "CAxis.h"
#include "CAxes.h"
#include "CLegend.h"
需要還可以繼續在之後引入
--------------------------------------------------------------------------------------------------------------------------------
2. teechart 畫圖 - 折線圖
TeeChart 畫圖步驟一般是先獲得圖線序列CSeries,再給Series添加點;添加點可以用函數AddXY,或者AddArray。AddArray要比AddXY的效率高出很多,其比較可見 TeeChart繪圖控件 - 之三 - 提高繪圖的效率
2.1 清除圖形
在畫線之前把圖形清除一下,否則會覆蓋,清除可用CSeries的函數Clear();但是當添加多個Series後要對所有Series都clear,這是很蛋疼的,因爲你有時都不知道有多少個Series,這樣可以先獲得Series的總數在clear
代碼如下
{
((CSeries)m_TeeChart.Series(i)).Clear();
}
{
for(long i = 0;i<m_TeeChart.get_SeriesCount();i++)
{
((CSeries)m_TeeChart.Series(i)).Clear();
}
}
2.2 普通連線圖
一般我們畫的圖都屬於這種,就是把點連接起來,選擇fast line 的 Normal,就是普通連線圖
在需要畫圖的地方先要獲得曲線序列Series,然後通過畫圖函數AddXY,或者AddArray作圖。
2.2.1 普通線圖 - AddXY
下面演示AddXY的方法AddXY就是一個一個加入點,在點數不多,且需要動態顯示的時候是不錯的選擇。點數多的情況下嘛,那就還是用AddArray了
先看看AddXY
const UINT nDATALENGTH= 100;
double dData[nDATALENGTH];
for (int i=0;i<nDATALENGTH;i++)
{
dData[i] = 100 * sin((float)i)*cos((float)4*i);
}
//ClearAllSeries();
CSeries lineSeries = (CSeries)m_TeeChart.Series(0);
lineSeries.Clear();//在最前面加上ClearAllSeries(ClearAllSeries是自己寫的函數)就不用了
for(int i=0;i<nDATALENGTH;i++)
{
lineSeries.AddXY((double)i,dData[i],NULL,0);
}
由於在TeeChart裏,只加了一個FastLine,所以Series(0)就算Fast Line,代碼首先獲得圖像序列m_TeeChart.Series(0);
然後再調用這個序列來作圖,作圖前先清空圖像,用ClearAllSeries()也可以
然後就是一個點一個點的往裏加了
做出來的效果:
for(int i=0;i<nDATALENGTH;i++)
{
str.Format(_T("點%d"),i);
lineSeries.AddXY((double)i,dData[i],str,0);
}
2.2.2 普通線圖 - AddArray
double dData[nDATALENGTH];
for (int i=0;i<nDATALENGTH;i++)
{
dData[i] = 100*sin((float)i)*cos((float)4*i);
}
//聲明如下數據:
VARIANT vAX,vAY;
SAFEARRAY* psax;
SAFEARRAY* psay;
SAFEARRAYBOUND rgsabound;
//初始化
rgsabound.cElements=nDATALENGTH;
rgsabound.lLbound=0;
psax=SafeArrayCreate(VT_R8,1,&rgsabound);//分配空間
psay=SafeArrayCreate(VT_R8,1,&rgsabound);
vAX.vt=VT_ARRAY|VT_R8;//設置爲double型數組,VT_R8就是指double
vAX.parray=psax;//把內容加入VARIANT中
vAY.vt=VT_ARRAY|VT_R8;
vAY.parray=psay;
//這時VARIANT 就可以加入數據了
double dtemp;//用來臨時存放x座標
for(long i=0;i<nDATALENGTH;i++)
{
dtemp = i;
SafeArrayPutElement(psax,&i,&dtemp);
dtemp = dData[i];
SafeArrayPutElement(psay,&i,&dtemp);
//更簡單寫法
//SafeArrayPutElement(psay,&i,dData+i);
}
//開始畫圖
CSeries lineSeries = (CSeries)m_TeeChart.Series(0);
lineSeries.Clear();
lineSeries.AddArray(nDATALENGTH,vAY,vAX);
COleSafeArray XValues;
COleSafeArray YValues;
DWORD numElements[] = {nDATALENGTH};
// 創建安全數組
XValues.Create(VT_R8, 1, numElements);
YValues.Create(VT_R8, 1, numElements);
// 初始化
long i;
double dval;
for(i=0; i<nDATALENGTH; i++)
{
dval = i;
XValues.PutElement(&i, &dval);
dval = dData[i];
YValues.PutElement(&i, &dval);
//YValues.PutElement(&i, dData+i);
};
CSeries lineSeries = (CSeries)m_TeeChart.Series(0);
lineSeries.Clear();
lineSeries.AddArray(nDATALENGTH,YValues,XValues);
2.3 去除/顯示legend
legend.put_Visible(FALSE);
添加單選控件 ,id爲IDC_CHECK_ShowLegend,
{
CLegend legend = (CLegend)m_TeeChart.get_Legend();
if(BST_CHECKED == ((CButton*)GetDlgItem(IDC_CHECK_ShowLegend))->GetCheck())
{
legend.put_Visible(TRUE);
}
else
{
legend.put_Visible(FALSE);
}
}
2.4 改變線圖顏色
3. teechart 畫圖 - 柱狀圖
3.1 添加柱狀圖
注意這裏默認是綠色的,等下會發現畫出來的不一樣
3.2 AddXY
double dData[nDATALENGTH];
for (int i=0;i<nDATALENGTH;i++)
{
dData[i] = abs(100*sin((float)i));
}
//
ClearAllSeries();
CSeries barSeries = (CSeries)m_TeeChart.Series(1);
for(int i=0;i<nDATALENGTH;i++)
{
barSeries.AddXY((double)i,dData[i],NULL,0);
}
3.3 改變柱狀圖的顏色
{
i%2== 0
? barSeries.AddXY((double)i,dData[i],NULL,RGB(255,255,0))
: barSeries.AddXY((double)i,dData[i],NULL,RGB(0,255,255));
}
3.4 去除/顯示 數據標示
添加單選控件 IDC_CHECK_Marks
{
CSeries barSeries = (CSeries)m_TeeChart.Series(1);
CMarks SeriesMarks = (CMarks)barSeries.get_Marks();
if(BST_CHECKED == ((CButton*)GetDlgItem(IDC_CHECK_Marks))->GetCheck())
{
SeriesMarks.put_Visible(TRUE);
}
else
{
SeriesMarks.put_Visible(FALSE);
}
}
3.5 AddArray 給柱狀圖添加數據
const UINT nDATALENGTH = 20;
double dData[nDATALENGTH];
for (int i=0;i<nDATALENGTH;i++)
{
dData[i] = abs(100*sin((float)i));
}
COleSafeArray XValues;
COleSafeArray YValues;
DWORD numElements[] = {nDATALENGTH};
// 創建安全數組
XValues.Create(VT_R8, 1, numElements);
YValues.Create(VT_R8, 1, numElements);
// 初始化
long i;
double dval;
for(i=0; i<nDATALENGTH; i++)
{
dval = i;
XValues.PutElement(&i, &dval);
dval = dData[i];
YValues.PutElement(&i, &dval);
//YValues.PutElement(&i, dData+i);
};
//
ClearAllSeries();
CSeries lineSeries = (CSeries)m_TeeChart.Series(1);
lineSeries.AddArray(nDATALENGTH,YValues,XValues);