程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 深入淺出CChart 每日一課——第二課 上一課代碼分析,骨骼精奇之一點即通 .

深入淺出CChart 每日一課——第二課 上一課代碼分析,骨骼精奇之一點即通 .

編輯:關於C語言

在第一課中,笨笨編寫了少量的代碼。對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的消息響應,而且不需要編寫任何代碼。世界上有免費的午餐嗎?見證奇跡的時刻就要到了。敬請期待。

現在下課。

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