上一課展示了CChart的第一個高級功能,本節課繼續第一課的話題,介紹CChart最基本的功能——折線圖的繪制。
在第一課中,曲線數據是用AddPoint2D一點一點地加進去的,同學們是不是覺得這個方法有點傻?要是有幾百個上千個數據點的話,豈不得累死!
下面介紹CChart類的一個函數。
int AddCurve(double *pX, double *pY, int nLen, int nPlotIndex=0);
從名字就可以看出,這個函數是用來添加曲線的。
首先看看函數的參數。pX和pY是兩個double型數組,用來存放曲線的x坐標與y坐標;nLen表示數據點的個數;nIndex參數稍微解釋一下,這個表示子視圖的序號。CChart可以處理分裂視圖、分層視圖,這些視圖具有子視圖,nPlotIndex表示需要往第nPlotIndex個子視圖上添加曲線。
再看看函數的返回參數,是一個int值,表示曲線的ID號。
CChart可以繪制多條曲線,在程序內部,多條曲線是用vector的方式存放的。Vector類似數組,可以用下標來存取。但CChart支持曲線的排序、插入、刪除等操作,經過這些過程後,曲線在vector中的下標會改變。怎樣保證曲線標識的唯一性呢,這就是曲線的ID。
簡單地說,曲線的ID號就相當於人的身份證號,人的身份證號在人的一生中是唯一的且不變的當然,如果你是房爺趙海濱,你可以擁有無數的身份證號,外加無數套房子,但這不在我們的考慮之列)。曲線的ID號也如此,無論曲線經過多少次排序、插入、刪除操作,都始終保持不變。
曲線的ID號在CChart中應用非常之多,這是後話,這裡暫且跳過。
下面利用AddCurve來增加曲線。
與前面的課程一樣,建立一個VC6項目,名稱為Lesson05。
把WM_CREATE消息的響應例程寫成這樣。
case WM_CREATE: chartWnd.Attach(hWnd, kTypeXY); { double pX[360], pY[360]; double Pi = 3.1415926536; int i; for(i=0; i<360; i++) { pX[i] = i; pY[i] = 5.0*sin(i*2.0*Pi/360.0*3.0); } chartWnd.GetChart()->AddCurve(pX, pY, 360); } chartWnd.GetChart()->SetTitle(_T("CChart繪制折線圖")); break;
在Lesson05.cpp文件頭部附近加上下面一句。
#include <math.h>
這句話的用途不用笨笨唠叨了吧。
程序的其余部分和前幾課的完全一樣。
運行程序,效果如圖。
這裡繪制了一條正弦曲線。
上面的代碼首先准備了兩個數組pX和pY用來存放數據點,然後用AddCurve把曲線加了進來。
既然上面用的函數叫AddCurve,顧名思義,曲線還能繼續加。讓我們修改WM_CREATE消息的響應例程如下。
case WM_CREATE: chartWnd.Attach(hWnd, kTypeXY); { double pX[360], pY[360]; double Pi = 3.1415926536; int i; for(i=0; i<360; i++) { pX[i] = i; pY[i] = 5.0*sin(i*2.0*Pi/360.0*3.0); } chartWnd.GetChart()->AddCurve(pX, pY, 360); for(i=0; i<360; i++) { pX[i] = i; pY[i] = 2.0*cos(i*2.0*Pi/360.0*3.0); } chartWnd.GetChart()->AddCurve(pX, pY, 360); } chartWnd.GetChart()->SetTitle(_T("CChart繪制折線圖")); break;
上面又添加了一條曲線,運行效果如圖。
第二條曲線畫出來啦!
理論上只要你的計算機內存夠大,你想加多少條曲線都是可以的,CChart本身對曲線的條數是沒有限制的。
下面討論一些別的問題。
在第三課中,我們利用右鍵菜單,在屏幕上調出了圖例。下面我們用代碼的方式調出圖例。
同樣在WM_CREATE的響應例程裡面,在break;這一行的前面,添加下面一句話。
chartWnd.GetChart()->SetUseLegend(true);
運行效果如圖。
現在屏幕上有兩條曲線,圖例裡面也有兩個標識,圖例中標識的顏色和曲線的顏色是對應的。
圖例標識中的一串字母和數字就是那條曲線的名稱,有需要的話,把名稱改成中文的也沒有問題。下面我們就試試看,把第一條曲線的名稱改成“王菲”,第二條曲線的名稱改成“李亞鵬”。
同樣在WM_CREATE的break;這一行的前面,添加下面兩句話。
chartWnd.GetChart()->SetDataTitle(_T("王菲"), 0); chartWnd.GetChart()->SetDataTitle(_T("李亞鵬"), 1);
運行程序,效果出來啦!
這裡解釋一下CChart類的SetDataTitle函數,其原型如下。
void SetDataTitle(const TCHAR* title, int nDataIndex, int nPlotIndex=0);
第一個參數title當然就是要設置的數據名稱了;第二個參數nDataIndex表示曲線的序號,按照添加的順序,從0開始計算;第三個參數nPlotIndex表示子圖的序號,從0開始計算,默認為0,也就是第一個子圖,這個參數僅僅對於分裂視圖、分層視圖、共享X軸視圖有效。
下面再關注一下坐標軸。從上面的圖中,我們看到坐標軸沒有標題,現在我們給兩個坐標軸都加上標題。
同樣在WM_CREATE的break;這一行的前面,添加下面兩句話。
chartWnd.GetChart()->SetAxisTitle(_T("橫軸"), 1); chartWnd.GetChart()->SetAxisTitle(_T("縱軸"), 0);
運行效果如圖。
SetAxisTitle的定義如下。
void SetAxisTitle(const TCHAR* title, int location, int nPlotIndex=0);
第一個參數title當然就是要設置的坐標軸名稱了;第二個參數location表示坐標軸位置,這裡需要解釋一下,左坐標軸為0,下坐標軸為1,右坐標軸為2,上坐標軸為3,這個問題大家可以打開Chart.h,看看文件頭部被注釋掉的一些enum定義,就完全清楚了;第三個參數nPlotIndex表示子圖的序號,默認為0。
最後我們來看看背景網格。
同樣在WM_CREATE的break;這一行的前面,添加下面兩句話。
chartWnd.GetChart()->SetGridLine(true, true, true, true); chartWnd.GetChart()->SetBkgndColor(RGB(224, 224, 224));
這下圖像和原來大不一樣了。
SetGridLine設置網格的繪制情況,定義如下。
void SetGridLine(bool MajorH=true, bool MajorV=true, bool MinorH=false, bool MinorV=false, int nPlotIndex=0);
CChart的背景網格有兩套,分別是主網格和副網格。SetGridLine的前四個參數分別表示是否繪制主網格橫線、主網格豎線、副網格橫線、副網格豎線,第五個參數是子圖序號,前面已經解釋。
SetBkgndColor設置背景顏色,定義如下。
void SetBkgndColor(COLORREF color, int nPlotIndex=0);
參數不用笨笨給大家解釋了吧。
好了,這節課笨笨快累暈了,趕緊下課吧。