程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 深入淺出CChart 每日一課——第五課 回到折線圖,苦逼屌絲之萬丈高樓平地起

深入淺出CChart 每日一課——第五課 回到折線圖,苦逼屌絲之萬丈高樓平地起

編輯:關於C語言

上一課展示了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>
 

這句話的用途不用笨笨唠叨了吧。

程序的其余部分和前幾課的完全一樣。

運行程序,效果如圖。

SouthEast

這裡繪制了一條正弦曲線。

上面的代碼首先准備了兩個數組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;
 

上面又添加了一條曲線,運行效果如圖。
SouthEast

第二條曲線畫出來啦!

理論上只要你的計算機內存夠大,你想加多少條曲線都是可以的,CChart本身對曲線的條數是沒有限制的。

下面討論一些別的問題。

在第三課中,我們利用右鍵菜單,在屏幕上調出了圖例。下面我們用代碼的方式調出圖例。

同樣在WM_CREATE的響應例程裡面,在break;這一行的前面,添加下面一句話。

chartWnd.GetChart()->SetUseLegend(true);
 

運行效果如圖。

SouthEast

現在屏幕上有兩條曲線,圖例裡面也有兩個標識,圖例中標識的顏色和曲線的顏色是對應的。

圖例標識中的一串字母和數字就是那條曲線的名稱,有需要的話,把名稱改成中文的也沒有問題。下面我們就試試看,把第一條曲線的名稱改成“王菲”,第二條曲線的名稱改成“李亞鵬”。

同樣在WM_CREATE的break;這一行的前面,添加下面兩句話。

chartWnd.GetChart()->SetDataTitle(_T("王菲"), 0);
chartWnd.GetChart()->SetDataTitle(_T("李亞鵬"), 1);
 

運行程序,效果出來啦!
SouthEast

這裡解釋一下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);
 

運行效果如圖。
SouthEast

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

這下圖像和原來大不一樣了。

SouthEast

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

參數不用笨笨給大家解釋了吧。

好了,這節課笨笨快累暈了,趕緊下課吧。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved