记得第一次认识你,是在操场边那丛夹竹桃下。时光荏苒,物是人非,现如今,我这张旧船票还能否登上你的客船?

第三课曾经介绍了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类的一个包含消息处理的包装。

笨笨本人一般喜欢采用本节课的编程方法。这种方法和第一课的方法没有本质区别,只是用起来可能要灵活一点吧。

今天的你我,重复了昨天的故事,我这张旧船票登上了你的客船。人大赵代表曾经说过,涛声依旧。欧耶!