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

轉載:http://blog.csdn.net/leichelle/article/details/7994376

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;
SAFEARRAYpsay;
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));

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章