TeeChart控件
來自:https://blog.csdn.net/czyt1988/article/details/7428415
C++ GUI 繪圖控件目錄
MFC
VS2010 使用TeeChart繪圖控件 - 之一 - 控件和類的導入
VS2010 使用TeeChart繪圖控件 - 之二 - 繪制圖形(折線圖,柱狀圖)
TeeChart繪圖控件 - 之三 - 提高繪圖的效率
MFC下好用的高速繪圖控件-(Hight-Speed Charting)
繪制動態曲線
Qt
qt超強精美繪圖控件 - QCustomPlot一覽
qt超強繪圖控件qwt - 安裝及配置
QtChart Qt官方繪圖控件
vs2010的用法和vc6有很大的不同,特別是在一些函數調用那里,當然。控件導入也是很不一樣的
安裝好控件后就可以在工程里加入teechart控件了
加入方法有如下幾種:
1.添加Teechart控件
1.1 插入Teechart控件
1.1.1 插入控件
新建一個對話框工程,在對話框上點擊鼠標右鍵,彈出的菜單里選擇“插入ActiveX控件”
然后彈出的對話框里選擇TeeChart控件
這時對話框就有TeeChart控件了
1.1.2 vs2010另外一種插入控件的方法
vs2010對話框設置的工具欄上就有許多控件了,若想把我們常用的控件也加到工具欄上以后使用就很方便了,下面說的這種方法就是把控件加入工具欄里。方便以后的調用
在工具欄的空白處點擊右鍵,選擇添加選項卡
這時vs就會新建一個選項卡,自己可以定義一個名稱,這里命名為繪圖控件
為選項卡添加項:在新建的選項卡的空白處點擊右鍵,選擇“選擇項”
由于控件比較多,會耗費一定的時間打開這個選擇項,別以為死機了,耐心等個幾十秒吧
在打開的對話框中選擇選擇com標簽,選擇teechart控件
這樣teechart控件就會在你的工具欄新加的選項里了,以后都會存在(我添加TeeChat的同時還把其他的一些控件添加進去了)
1.1.3 控件屬性設置
雙擊控件進行相關設置
這里添加一個快速線圖-Fast Line
若數據量特別大,可以在Series標簽里的Format的Draw all選項去掉
在Chart標簽里還可以設置坐標軸的名稱屬性等,這里先不詳細講述屬性的設置
2.為控件添加類
?
vs2010與vc6不一樣,vs2010的控件對應的類添加相對比vc6麻煩
這里就對剛剛加入的TeeChart控件加入相關的類
?
2.1 添加TypeLib的mfc類
(1)選擇vs菜單“項目”-“添加類”(注意這時類視圖樹形控件選中最頂端的父節點)
(2)添加TypeLib的mfc類
(3)在可用的類型庫里選擇teechart5
(4)在接口里就有TeeChart對應的所有類了,這里TChart是必須的接口,其他的可以根據需要添加
(5)點擊完成就把CTChart這個類添加進工程里了
其實第(2)步可以選擇ActiveX控件的Mfc類,操作方法雷同,不過這時是只列出對應的接口
3.把TeeChart控件和對象關聯
3.1 為控件關聯對象
在控件上點擊右鍵,選擇添加變量,即可為控件關聯對象
3.2 去掉vs默認的初始化
不知為何vs會默認給添加的變量初始化0,這個初始化一定要去掉否則無法使用
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);
}
?
這時TeeChart就可正常使用了
?
TeeChart5破解版下載地址:http://download.csdn.net/detail/czyt1988/4201107
vc6,vs2010皆可用
C++ GUI 繪圖控件目錄
MFC
VS2010 使用TeeChart繪圖控件 - 之一 - 控件和類的導入
VS2010 使用TeeChart繪圖控件 - 之二 - 繪制圖形(折線圖,柱狀圖)
TeeChart繪圖控件 - 之三 - 提高繪圖的效率
MFC下好用的高速繪圖控件-(Hight-Speed Charting)
繪制動態曲線
Qt
qt超強精美繪圖控件 - QCustomPlot一覽
qt超強繪圖控件qwt - 安裝及配置
?
?
?
來自:https://blog.csdn.net/wangshouchao/article/details/8837080
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));
????}
?
?
?
?
牛x
?
?
?
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));
?
?
總結
以上是生活随笔為你收集整理的TeeChart控件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不仅室内,思岚科技激光雷达在室外使用同样
- 下一篇: 手机怎么查通话记录