程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 深入淺出CChart 每日一課——第八課 又見交互功能,舊愛重逢

深入淺出CChart 每日一課——第八課 又見交互功能,舊愛重逢

編輯:關於C語言

記得第一次認識你,是在操場邊那叢夾竹桃下。時光荏苒,物是人非,現如今,我這張舊船票還能否登上你的客船?

第三課曾經介紹了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);
 


運行程序,效果如圖。

SouthEast

這和第一課幾乎一模一樣嘛。

動動鼠標,怎麼沒有交互的效果呢?

前面說了,我們這裡是另一種編程方法。這種方法需要手動處理消息。下面看看,手動處理消息到底有多困難。

第十步,編寫消息處理例程。

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類的一個包含消息處理的包裝。

笨笨本人一般喜歡采用本節課的編程方法。這種方法和第一課的方法沒有本質區別,只是用起來可能要靈活一點吧。

今天的你我,重復了昨天的故事,我這張舊船票登上了你的客船。人大趙代表曾經說過,濤聲依舊。歐耶!

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