VS2010 使用TeeChart繪圖控件 - - 繪制圖形(折線圖,柱狀圖)
C++ GUI 繪圖控件目錄
MFC
VS2010 使用TeeChart繪圖控件 - 之一 - 控件和類的導(dǎo)入VS2010 使用TeeChart繪圖控件 - 之二 - 繪制圖形(折線圖,柱狀圖)TeeChart繪圖控件 - 之三 - 提高繪圖的效率MFC下好用的高速繪圖控件-(Hight-Speed Charting)繪制動(dòng)態(tài)曲線
Qt
qt超強(qiáng)精美繪圖控件 - QCustomPlot一覽qt超強(qiáng)繪圖控件qwt - 安裝及配置
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ū)?,選擇添加類按鈕的下拉菜單,選擇類型庫(kù)中的MFC類
選擇teechart5即可
引入
#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:
constUINT?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)了
效果還是很不錯(cuò)的
?
加個(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ū)?,加入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 給柱狀圖添加數(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));
C++ GUI 繪圖控件目錄
MFC
VS2010 使用TeeChart繪圖控件 - 之一 - 控件和類的導(dǎo)入VS2010 使用TeeChart繪圖控件 - 之二 - 繪制圖形(折線圖,柱狀圖)TeeChart繪圖控件 - 之三 - 提高繪圖的效率MFC下好用的高速繪圖控件-(Hight-Speed Charting)繪制動(dòng)態(tài)曲線
Qt
qt超強(qiáng)精美繪圖控件 - QCustomPlot一覽qt超強(qiáng)繪圖控件qwt - 安裝及配置