记得第一次认识你,是在操场边那丛夹竹桃下。时光荏苒,物是人非,现如今,我这张旧船票还能否登上你的客船?
第三课曾经介绍了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类的一个包含消息处理的包装。
笨笨本人一般喜欢采用本节课的编程方法。这种方法和第一课的方法没有本质区别,只是用起来可能要灵活一点吧。
今天的你我,重复了昨天的故事,我这张旧船票登上了你的客船。人大赵代表曾经说过,涛声依旧。欧耶!