1.前期準(zhǔn)備
具體可見(jiàn)VS2010 使用TeeChart繪圖控件 - 之一 控件和類的導(dǎo)入
1. 1 添加TeeChart控件,給控件添加變量m_TeeChart
添加TeeChart控件,右擊控件,選擇添加變量,vs會(huì)自動(dòng)給我們引入CTchart1這個(gè)類,但是只有這個(gè)類,我們是遠(yuǎn)遠(yuǎn)不夠的,需要添加teechart其他相關(guān)的類,添加方法在之前已經(jīng)講過(guò),不再重復(fù)。

1.2. 引入必要的頭文件
其實(shí)之前的方法比較麻煩,更簡(jiǎn)單就是通過(guò)類向?qū)В瑢?dǎo)入類型庫(kù)的類。
如圖進(jìn)入類向?qū)Вx擇添加類按鈕的下拉菜單,選擇類型庫(kù)中的MFC類。

選擇teechart5即可。

暫時(shí)引入
#include "CSeries.h"
#include "CAxis.h"
#include "CAxes.h"
#include "CLegend.h"
需要還可以繼續(xù)在之后引入
2. teechart 畫(huà)圖 - 折線圖
TeeChart 畫(huà)圖步驟一般是先獲得圖線序列CSeries,再給Series添加點(diǎn);添加點(diǎn)可以用函數(shù)AddXY,或者AddArray。AddArray要比AddXY的效率高出很多,其比較可見(jiàn) TeeChart繪圖控件 - 之三 - 提高繪圖的效率
2.1 清除圖形
在畫(huà)線之前把圖形清除一下,否則會(huì)覆蓋,清除可用CSeries的函數(shù)Clear();
但是當(dāng)添加多個(gè)Series后要對(duì)所有Series都clear,這是很蛋疼的,因?yàn)槟阌袝r(shí)都不知道有多少個(gè)Series,這樣可以先獲得Series的總數(shù)在clear
代碼如下
for(long i = 0;i<m_TeeChart.get_SeriesCount();i++)
{
((CSeries)m_TeeChart.Series(i)).Clear();
}
通過(guò)CTchart 的get_SeriesCount函數(shù)獲得所有圖像序列,再全部清除,這個(gè)函數(shù)經(jīng)常用到,可用定義為類成員函數(shù),這里是個(gè)對(duì)話框CTChartDlg
void CTChartDlg::ClearAllSeries(void)
{
for(long i = 0;i<m_TeeChart.get_SeriesCount();i++)
{
((CSeries)m_TeeChart.Series(i)).Clear();
}
}
好了現(xiàn)在開(kāi)始說(shuō)說(shuō)怎么畫(huà)折線圖
2.2 普通連線圖

一般我們畫(huà)的圖都屬于這種,就是把點(diǎn)連接起來(lái),選擇fast line 的 Normal,就是普通連線圖。
在需要畫(huà)圖的地方先要獲得曲線序列Series,然后通過(guò)畫(huà)圖函數(shù)AddXY,或者AddArray作圖。
2.2.1 普通線圖 - AddXY
下面演示AddXY的方法。
AddXY就是一個(gè)一個(gè)加入點(diǎn),在點(diǎn)數(shù)不多,且需要?jiǎng)討B(tài)顯示的時(shí)候是不錯(cuò)的選擇。點(diǎn)數(shù)多的情況下嘛,那就還是用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是自己寫(xiě)的函數(shù))就不用了
for(int i=0;i<nDATALENGTH;i++)
{
lineSeries.AddXY((double)i,dData[i],NULL,0);
}
由于在TeeChart里,只加了一個(gè)FastLine,所以Series(0)就算Fast Line,代碼首先獲得圖像序列m_TeeChart.Series(0);
然后再調(diào)用這個(gè)序列來(lái)作圖,作圖前先清空?qǐng)D像,用ClearAllSeries()也可以。
然后就是一個(gè)點(diǎn)一個(gè)點(diǎn)的往里加了。
做出來(lái)的效果:

AddXY的第一個(gè)參數(shù)是x點(diǎn)坐標(biāo),第二個(gè)是y點(diǎn)坐標(biāo),第三個(gè)參數(shù)是為了使x坐標(biāo)特殊顯示,這是會(huì)替換掉x坐標(biāo)的顯示內(nèi)容,如我想顯示“點(diǎn)xx“可以這樣:
CString str;
for(int i=0;i<nDATALENGTH;i++)
{
str.Format(_T("點(diǎn)%d"),i);
lineSeries.AddXY((double)i,dData[i],str,0);
}

第四個(gè)參數(shù)在線圖里不起作用,在柱狀圖里可以設(shè)置顏色。
2.2.2 普通線圖 - AddArray
在數(shù)據(jù)量特別大時(shí),強(qiáng)烈建議使用AddArray函數(shù)。
AddArray的函數(shù)聲明如下:
void AddArray(long ArraySize, VARIANT& YArray, VARIANT& XArray);
x,y是兩個(gè)VARIANT的數(shù)據(jù)類型,VARIANT有個(gè)類型是VT_ARRAY,可以給VARIANT賦一個(gè)數(shù)組進(jìn)去。
具體操作如下:
方法1:
const UINT nDATALENGTH = 100;
double dData[nDATALENGTH];
for (int i=0;i<nDATALENGTH;i++)
{
dData[i] = 100*sin((float)i)*cos((float)4*i);
}
//聲明如下數(shù)據(jù):
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;//設(shè)置為double型數(shù)組,VT_R8就是指double
vAX.parray=psax;//把內(nèi)容加入VARIANT中
vAY.vt=VT_ARRAY|VT_R8;
vAY.parray=psay;
//這時(shí)VARIANT 就可以加入數(shù)據(jù)了
double dtemp;//用來(lái)臨時(shí)存放x坐標(biāo)
for(long i=0;i<nDATALENGTH;i++)
{
dtemp = i;
SafeArrayPutElement(psax,&i,&dtemp);
dtemp = dData[i];
SafeArrayPutElement(psay,&i,&dtemp);
//更簡(jiǎn)單寫(xiě)法
//SafeArrayPutElement(psay,&i,dData+i);
}
//開(kāi)始畫(huà)圖
CSeries lineSeries = (CSeries)m_TeeChart.Series(0);
lineSeries.Clear();
lineSeries.AddArray(nDATALENGTH,vAY,vAX);
方法2:
這時(shí)我看TeeChart官方實(shí)例找到的方法,相對(duì)簡(jiǎn)單點(diǎn):
COleSafeArray XValues;
COleSafeArray YValues;
DWORD numElements[] = {nDATALENGTH};
// 創(chuàng)建安全數(shù)組
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
如果不想要右邊那一欄數(shù)據(jù)顯示,可以通過(guò)代碼去除,CLegend是用來(lái)控制這個(gè)顯示的:
CLegend legend = (CLegend)m_TeeChart.get_Legend();
legend.put_Visible(FALSE);
可以用一個(gè)check控件控制器顯示狀態(tài)。
添加單選控件 ,
id為IDC_CHECK_ShowLegend,
單擊響應(yīng):
void CTChartDlg::OnBnClickedCheck_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);
}
}
效果:

不用代碼的話可以通過(guò)設(shè)置控件屬性

明顯,這沒(méi)有代碼靈活
2.4 改變線圖顏色
默認(rèn)設(shè)置是紅,我要設(shè)置成其他顏色可以用put_Colour。
如上代碼的lineSeries最后加一個(gè),就會(huì)變成RGB(255,0,255)的顏色了:
lineSeries.put_Color(RGB(255,0,255));
效果:
3. teechart 畫(huà)圖 - 柱狀圖
3.1 添加柱狀圖

這時(shí)會(huì)多一個(gè)圖形

注意這里默認(rèn)是綠色的,等下會(huì)發(fā)現(xiàn)畫(huà)出來(lái)的不一樣。
3.2 AddXY
方法和線圖沒(méi)什么區(qū)別,直接上碼:
const UINT nDATALENGTH = 20;
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);
}
注意不是Series(0)了
加個(gè)abs,好看很多~~

3.3 改變柱狀圖的顏色
為啥是黑色的?設(shè)置了綠色的,我一開(kāi)始也以為坑爹的設(shè)置沒(méi)有用,后來(lái)研究了一下發(fā)現(xiàn)時(shí)AddXY的第四個(gè)參數(shù)起作用的。
上面的圖我們是這樣加的:
barSeries.AddXY((double)i,dData[i],NULL,0);
第四個(gè)參數(shù)0就相當(dāng)于RGB(0,0,0),這第四個(gè)參數(shù)就是設(shè)置顏色的了。
把程序稍作修改:
for(int i=0;i<nDATALENGTH;i++)
{
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 去除/顯示 數(shù)據(jù)標(biāo)示
好吧又遇到問(wèn)題了,去掉上面的標(biāo)示。
ok,那個(gè)標(biāo)示是用CMarks管理的,加入這個(gè)類就行了,用類向?qū)В尤隒Marks:
#include "CMarks.h"
添加單選控件
IDC_CHECK_Marks
void CTChartDlg::OnBnClickedCheckMarks()
{
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 給柱狀圖添加數(shù)據(jù)
和line一樣:
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};
// 創(chuàng)建安全數(shù)組
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);
這時(shí)出現(xiàn)的圖像就是默認(rèn)的顏色了

想改顏色!沒(méi)問(wèn)題,還是用put_Color
barSeries.put_Color(RGB(255,0,0));

from CSDN
標(biāo)簽:
teechart
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn