TeeChart控件
來(lái)自:https://blog.csdn.net/czyt1988/article/details/7428415
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 - 安裝及配置
QtChart Qt官方繪圖控件
vs2010的用法和vc6有很大的不同,特別是在一些函數(shù)調(diào)用那里,當(dāng)然??丶?dǎo)入也是很不一樣的
安裝好控件后就可以在工程里加入teechart控件了
加入方法有如下幾種:
1.添加Teechart控件
1.1 插入Teechart控件
1.1.1 插入控件
新建一個(gè)對(duì)話框工程,在對(duì)話框上點(diǎn)擊鼠標(biāo)右鍵,彈出的菜單里選擇“插入ActiveX控件”
然后彈出的對(duì)話框里選擇TeeChart控件
這時(shí)對(duì)話框就有TeeChart控件了
1.1.2 vs2010另外一種插入控件的方法
vs2010對(duì)話框設(shè)置的工具欄上就有許多控件了,若想把我們常用的控件也加到工具欄上以后使用就很方便了,下面說(shuō)的這種方法就是把控件加入工具欄里。方便以后的調(diào)用
在工具欄的空白處點(diǎn)擊右鍵,選擇添加選項(xiàng)卡
這時(shí)vs就會(huì)新建一個(gè)選項(xiàng)卡,自己可以定義一個(gè)名稱,這里命名為繪圖控件
為選項(xiàng)卡添加項(xiàng):在新建的選項(xiàng)卡的空白處點(diǎn)擊右鍵,選擇“選擇項(xiàng)”
由于控件比較多,會(huì)耗費(fèi)一定的時(shí)間打開(kāi)這個(gè)選擇項(xiàng),別以為死機(jī)了,耐心等個(gè)幾十秒吧
在打開(kāi)的對(duì)話框中選擇選擇com標(biāo)簽,選擇teechart控件
這樣teechart控件就會(huì)在你的工具欄新加的選項(xiàng)里了,以后都會(huì)存在(我添加TeeChat的同時(shí)還把其他的一些控件添加進(jìn)去了)
1.1.3 控件屬性設(shè)置
雙擊控件進(jìn)行相關(guān)設(shè)置
這里添加一個(gè)快速線圖-Fast Line
若數(shù)據(jù)量特別大,可以在Series標(biāo)簽里的Format的Draw all選項(xiàng)去掉
在Chart標(biāo)簽里還可以設(shè)置坐標(biāo)軸的名稱屬性等,這里先不詳細(xì)講述屬性的設(shè)置
2.為控件添加類
?
vs2010與vc6不一樣,vs2010的控件對(duì)應(yīng)的類添加相對(duì)比vc6麻煩
這里就對(duì)剛剛加入的TeeChart控件加入相關(guān)的類
?
2.1 添加TypeLib的mfc類
(1)選擇vs菜單“項(xiàng)目”-“添加類”(注意這時(shí)類視圖樹(shù)形控件選中最頂端的父節(jié)點(diǎn))
(2)添加TypeLib的mfc類
(3)在可用的類型庫(kù)里選擇teechart5
(4)在接口里就有TeeChart對(duì)應(yīng)的所有類了,這里TChart是必須的接口,其他的可以根據(jù)需要添加
(5)點(diǎn)擊完成就把CTChart這個(gè)類添加進(jìn)工程里了
其實(shí)第(2)步可以選擇ActiveX控件的Mfc類,操作方法雷同,不過(guò)這時(shí)是只列出對(duì)應(yīng)的接口
3.把TeeChart控件和對(duì)象關(guān)聯(lián)
3.1 為控件關(guān)聯(lián)對(duì)象
在控件上點(diǎn)擊右鍵,選擇添加變量,即可為控件關(guān)聯(lián)對(duì)象
3.2 去掉vs默認(rèn)的初始化
不知為何vs會(huì)默認(rèn)給添加的變量初始化0,這個(gè)初始化一定要去掉否則無(wú)法使用
public: ? ? CTchart1 m_Chart;
CTeeChartDlg::CTeeChartDlg(CWnd* pParent/*=NULL*/)?
? ? : CDialogEx(CTeeChartDlg::IDD, pParent)
{
? ? m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
?
void CTeeChartDlg::DoDataExchange(CDataExchange* pDX)?
{
? ? CDialogEx::DoDataExchange(pDX);
? ? DDX_Control(pDX, IDC_TCHART1, m_Chart);
}
?
這時(shí)TeeChart就可正常使用了
?
TeeChart5破解版下載地址:http://download.csdn.net/detail/czyt1988/4201107
vc6,vs2010皆可用
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 - 安裝及配置
?
?
?
來(lái)自:https://blog.csdn.net/wangshouchao/article/details/8837080
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ū)?#xff0c;導(dǎo)入類型庫(kù)的類
?
如圖進(jìn)入類向?qū)?#xff0c;選擇添加類按鈕的下拉菜單,選擇類型庫(kù)中的MFC類
?
?
選擇teechart5即可
?
?
?
暫時(shí)引入
#include "CSeries.h"?
#include "CAxis.h"
#include "CAxes.h"
#include "CLegend.h"
需要還可以繼續(xù)在之后引入
?
--------------------------------------------------------------------------------------------------------------------------------
?
2. teechart 畫圖 - 折線圖
?
TeeChart 畫圖步驟一般是先獲得圖線序列CSeries,再給Series添加點(diǎn);添加點(diǎn)可以用函數(shù)AddXY,或者AddArray。AddArray要比AddXY的效率高出很多,其比較可見(jiàn) TeeChart繪圖控件 - 之三 - 提高繪圖的效率
?
?
?
2.1 清除圖形
在畫線之前把圖形清除一下,否則會(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ō)怎么畫折線圖
?
?
2.2 普通連線圖
一般我們畫的圖都屬于這種,就是把點(diǎn)連接起來(lái),選擇fast line 的 Normal,就是普通連線圖
在需要畫圖的地方先要獲得曲線序列Series,然后通過(guò)畫圖函數(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是自己寫的函數(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)單寫法
????//SafeArrayPutElement(psay,&i,dData+i);
}
//開(kāi)始畫圖
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 畫圖 - ?柱狀圖
?
3.1 ?添加柱狀圖
?
?
這時(shí)會(huì)多一個(gè)圖形
?
?
?
注意這里默認(rèn)是綠色的,等下會(huì)發(fā)現(xiàn)畫出來(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));
????}
?
?
?
?
牛x
?
?
?
3.4 去除/顯示 數(shù)據(jù)標(biāo)示
?
好吧又遇到問(wèn)題了,去掉上面的標(biāo)示
ok,那個(gè)標(biāo)示是用CMarks管理的,加入這個(gè)類就行了,用類向?qū)?#xff0c;加入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));
?
?
總結(jié)
以上是生活随笔為你收集整理的TeeChart控件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 不仅室内,思岚科技激光雷达在室外使用同样
- 下一篇: 手机怎么查通话记录