在第一课中,笨笨编写了少量的代码。对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。
第二段代码如下。
首先解释一下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的消息响应,而且不需要编写任何代码。世界上有免费的午餐吗?见证奇迹的时刻就要到了。敬请期待。
现在下课。