1.前期準備
具體可見VS2010 使用TeeChart繪圖控件 - 之一 控件和類的導入
1. 1 添加TeeChart控件,給控件添加變量m_TeeChart
添加TeeChart控件,右擊控件,選擇添加變量,vs會自動給我們引入CTchart1這個類,但是只有這個類,我們是遠遠不夠的,需要添加teechart其他相關的類,添加方法在之前已經講過,不再重復。

1.2. 引入必要的頭文件
其實之前的方法比較麻煩,更簡單就是通過類向導,導入類型庫的類。
如圖進入類向導,選擇添加類按鈕的下拉菜單,選擇類型庫中的MFC類。

選擇teechart5即可。

暫時引入
#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
代碼如下
for(long i = 0;i<m_TeeChart.get_SeriesCount();i++)
{
((CSeries)m_TeeChart.Series(i)).Clear();
}
通過CTchart 的get_SeriesCount函數獲得所有圖像序列,再全部清除,這個函數經常用到,可用定義為類成員函數,這里是個對話框CTChartDlg
void CTChartDlg::ClearAllSeries(void)
{
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()也可以。
然后就是一個點一個點的往里加了。
做出來的效果:

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

第四個參數在線圖里不起作用,在柱狀圖里可以設置顏色。
2.2.2 普通線圖 - AddArray
在數據量特別大時,強烈建議使用AddArray函數。
AddArray的函數聲明如下:
void AddArray(long ArraySize, VARIANT& YArray, VARIANT& XArray);
x,y是兩個VARIANT的數據類型,VARIANT有個類型是VT_ARRAY,可以給VARIANT賦一個數組進去。
具體操作如下:
方法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);
}
//聲明如下數據:
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);
方法2:
這時我看TeeChart官方實例找到的方法,相對簡單點:
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
如果不想要右邊那一欄數據顯示,可以通過代碼去除,CLegend是用來控制這個顯示的:
CLegend legend = (CLegend)m_TeeChart.get_Legend();
legend.put_Visible(FALSE);
可以用一個check控件控制器顯示狀態。
添加單選控件 ,
id為IDC_CHECK_ShowLegend,
單擊響應:
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);
}
}
效果:

不用代碼的話可以通過設置控件屬性

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

這時會多一個圖形

注意這里默認是綠色的,等下會發現畫出來的不一樣。
3.2 AddXY
方法和線圖沒什么區別,直接上碼:
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)了
加個abs,好看很多~~

3.3 改變柱狀圖的顏色
為啥是黑色的?設置了綠色的,我一開始也以為坑爹的設置沒有用,后來研究了一下發現時AddXY的第四個參數起作用的。
上面的圖我們是這樣加的:
barSeries.AddXY((double)i,dData[i],NULL,0);
第四個參數0就相當于RGB(0,0,0),這第四個參數就是設置顏色的了。
把程序稍作修改:
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 去除/顯示 數據標示
好吧又遇到問題了,去掉上面的標示。
ok,那個標示是用CMarks管理的,加入這個類就行了,用類向導,加入CMarks:
#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 給柱狀圖添加數據
和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};
// 創建安全數組
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);
這時出現的圖像就是默認的顏色了

想改顏色!沒問題,還是用put_Color
barSeries.put_Color(RGB(255,0,0));

from CSDN
標簽:
teechart
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn