記得第一次認識你,是在操場邊那叢夾竹桃下。時光荏苒,物是人非,現如今,我這張舊船票還能否登上你的客船?
第三課曾經介紹了CChart的交互功能,那裡只寫了半句代碼,顯示了CChart內部引擎的強大。
稍微接觸過Windows編程的同學都明白,所謂交互,無非是Windows的一些消息處理。
本節課笨笨采用另一種編程方法,把CChart的消息處理過程做透明處理。
和第一節課一樣,我們還是一步一步來。
現在開始!
第一步,請打開VC6。
第二步,選擇File-->New,並選擇Win32Application,在Projectname框中輸入Lesson08,在Location框中選擇合適的路徑。
第三步,點擊OK按鈕,在出現的對話框中選擇Atypical“HelloWorld”application,並點擊Finish按鈕,在出現的下一個對話框中點擊OK按鈕。
第四步,把CChartDll.7z文件解壓,並把其中Library文件夾中的5個文件全部拷貝到剛才新建的Lesson08項目的文件夾中。
第五步,在VC中打開Lesson08.cpp文件,在文件頭部原有的#defineMAX_LOADSTRING100這一行下面輸入以下代碼。
#include "Chart.h" #ifdef _DEBUG #pragma comment(lib, "PlotDll_d.lib") #else #pragma comment(lib, "PlotDll.lib") #endif
前五步和第一課完全一樣。
第六步,找到Lesson08.cpp中MyRegisterClass函數,修改wcex.style=CS_HREDRAW|CS_VREDRAW;這一行如下。
wcex.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
這個步驟在第三課介紹過,目的是響應鼠標雙擊。
第七步,找到Lesson08.cpp文件的WndProc函數,並在原有LoadString(hInst,IDS_HELLO,szHello,MAX_LOADSTRING);這一行下面輸入以下代碼。
static CChart chart;
注意這裡和第一課不同,我們定義的變量類型為CChart,不再是CChartWnd,這是關鍵的變化。
第八步,找到WndProc函數中WM_PAINT消息響應例程,在caseWM_PAINT的上一行,編寫WM_CREATE的響應例程。為了方便,我們保持代碼和第一課基本不變。
case WM_CREATE: chart.SetType(kTypeXY); chart.AddPoint2D(-3.0, 9.0); chart.AddPoint2D(-2.0, 4.0); chart.AddPoint2D(-1.0, 1.0); chart.AddPoint2D(0.0, 0.0); chart.AddPoint2D(1.0, 1.0); chart.AddPoint2D(2.0, 4.0); chart.AddPoint2D(3.0, 9.0); chart.SetTitle(_T("另一個CChart程序!")); break;
由於這裡直接定義的是CChart變量chart,省去了第一課CChartWnd::GetChart()函數的調用。
首先用SetType函數把chart的繪圖類型設置為折線圖kTypeXY,然後仍然用AddPoint2D添加數據點,最後用SetTilte修改圖像標題。
第九步,修改WM_PAINT消息響應例程。
刪除或屏蔽掉下面這一行。
DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
在這一行的位置,添加一行新代碼。
chart.OnDraw(hdc, rt);
運行程序,效果如圖。
這和第一課幾乎一模一樣嘛。
動動鼠標,怎麼沒有交互的效果呢?
前面說了,我們這裡是另一種編程方法。這種方法需要手動處理消息。下面看看,手動處理消息到底有多困難。
第十步,編寫消息處理例程。
case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_LBUTTONDBLCLK: case WM_MOUSEMOVE: case WM_CONTEXTMENU: case WM_KEYDOWN: case WM_SIZE: case WM_ERASEBKGND: chart.Interactive(hWnd, message, wParam, lParam); break;
這裡處理了少量幾種消息,包括鼠標和鍵盤。所有消息實際都交給了CChart類的Interactive函數。
看起來手動處理消息也很簡單嘛。
注意這裡的WM_ERASEBKGND消息,同學們也可以自己單獨處理,直接返回,不要調用WndProc的默認處理函數,不然屏幕圖像會閃爍的。其實CChart內部對這個消息什麼也沒干。
運行程序,同學們動動鼠標,交互功能又回來了,哈哈。運行效果和第一課的程序一模一樣喲。
現在同學們可以理解了,第一課采用的CChartWnd類,實際上就是本節課CChart類的一個包含消息處理的包裝。
笨笨本人一般喜歡采用本節課的編程方法。這種方法和第一課的方法沒有本質區別,只是用起來可能要靈活一點吧。
今天的你我,重復了昨天的故事,我這張舊船票登上了你的客船。人大趙代表曾經說過,濤聲依舊。歐耶!