在第一課中,笨笨編寫了少量的代碼。對CChart不熟悉的人對部分代碼可能不能理解,下面給同學們解釋一下。
第一段代碼如下。
#include "Chart.h" #ifdef _DEBUG #pragma comment(lib, "PlotDll_d.lib") #else #pragma comment(lib, "PlotDll.lib") #endif
這一段大家應該很好理解,這是C++的預處理。
首先包含頭文件Chart.h。
然後根據是否編譯Debug版本選擇不同的導入庫。如果編譯Debug版本,需要鏈接PlotDll_d.lib這個導入庫,運行的時候會載入PlotDll_d.dll。如果編譯Release版本,需要鏈接PlotDll.lib這個導入庫,運行的時候會載入PlotDll.dll。
第二段代碼如下。
static CChartWnd chartWnd;這句話定義了一個CChartWnd類的變量chartWnd。
首先解釋一下CChartWnd類。
為完成各種繪圖操作,CChart類庫中具有大量的類,繪圖工作就由這些類完成。但CChart內部類的定義都是模板形式,使用不甚方便,故笨笨做了一個包裝類CChart,隱藏了模板類的實現細節。
而CChartWnd類則是在CChart類的基礎上實現的一個窗口類,建立這個類的目的是為了自動實現消息響應,減少同學們編寫的代碼量。CChartWnd同時是一個窗口,可以理解為MFC中的CWnd,當然它和CWnd沒有關系,CChart整個類庫都與MFC沒有關系。
要用幾句話完全解釋清楚CChartWnd類是比較困難的,不清楚的同學可以在下載的CChartDll.7z文件中查看說明書。
這裡把chartWnd變量設置為static,原因是chartWnd變量的定義位置在窗口函數WndProc內部,不設置static屬性的話,WndProc一退出,chartWnd就被釋放掉了。如果把chartWnd設置為全局變量,就可以不用static了。
第三段代碼如下。
case WM_CREATE: chartWnd.Attach(hWnd, kTypeXY); chartWnd.GetChart()->AddPoint2D(-3.0, 9.0); chartWnd.GetChart()->AddPoint2D(-2.0, 4.0); chartWnd.GetChart()->AddPoint2D(-1.0, 1.0); chartWnd.GetChart()->AddPoint2D(0.0, 0.0); chartWnd.GetChart()->AddPoint2D(1.0, 1.0); chartWnd.GetChart()->AddPoint2D(2.0, 4.0); chartWnd.GetChart()->AddPoint2D(3.0, 9.0); chartWnd.GetChart()->SetTitle(_T("Hello World,我的第一個CChart程序!")); break;
這段代碼響應WM_CREATE消息,在窗口創建的時候設置繪圖的數據和屬性。
chartWnd.Attach(hWnd,kTypeXY);
這句話即“粘窗口”,相當於把CChartWnd這個窗口“粘”到程序的主窗口上。
第一個參數hWnd即是主窗口句柄。
第二個參數kTypeXY是本人定義的一個enum,實際上也就是一個int變量,表示繪圖的類型。kTypeXY表示最簡單的折線圖,當然還有很多種繪圖類型,這裡不詳述。
注意“粘窗口”以後,主窗口的消息循環被chartWnd的消息循環替代了。大家不用擔心,CChartWnd只處理少量必要的消息,剩余消息還是交給主窗口原來的消息處理函數處理。
chartWnd.GetChart()->AddPoint2D(-3.0,9.0);
CChartWnd的函數CChartWnd::GetChart()獲得包裝的CChart類指針。
CChart::AddPoint2D(doublex,doubley)同學們應該很好理解吧,在圖像上增加一個數據點。
這裡一共增加了7個數據點。
chartWnd.GetChart()->SetTitle(_T("HelloWorld,我的第一個CChart程序!"));
這句話設置圖像的標題,也很好理解。
第四段代碼如下。
chartWnd.Detach();這句話放置在消息WM_DESTROY的響應代碼中。
前面在WM_CREATE消息中把chartWnd“粘”到了主窗口上,這裡在程序退出錢,把chartWnd窗口從主窗口上“取”下來。因為chartWnd已經接管主窗口的消息循環,不這樣的話,消息循環就亂了。
第五段代碼如下。這段代碼不是我們要編寫的,而是我們要刪除的。
case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: Add any drawing code here... RECT rt; GetClientRect(hWnd, &rt); DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER); EndPaint(hWnd, &ps); break;
由於chartWnd已經接管主窗口的消息循環,這段話實際上不起作用,也就是聾子的耳朵——純粹擺設了,所以刪掉它。實際不刪也沒關系,只是笨笨有點潔癖,呵呵。
第二課結束,大家還有問題嗎?有問題請打開CChartDll.7z文件裡面的說明書看看。
下一課是激動人心的一刻,介紹CChart的消息響應,而且不需要編寫任何代碼。世界上有免費的午餐嗎?見證奇跡的時刻就要到了。敬請期待。
現在下課。