VS2010 使用TeeChart畫圖控件 - 之二 - 繪制圖形(折線圖,柱狀圖)



1.前期准備

 詳細可見VS2010 使用TeeChart畫圖控件 - 之中的一個 控件和類的導入


1. 1 加入TeeChart控件,給控件加入變量m_TeeChart

 

加入TeeChart控件,右擊控件,選擇加入變量,vs會自己主動給我們引入CTchart1這個類,可是僅僅有這個類,我們是遠遠不夠的,須要加入teechart其它相關的類,加入方法在之前已經講過,不再反復。



1.2. 引入必要的頭文件

事實上之前的方法比較麻煩,更簡單就是通過類向導,導入類型庫的類

如圖進入類向導,選擇加入類button的下拉菜單,選擇類型庫中的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));


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM