在第一课中,笨笨编写了少量的代码。对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

第二段代码如下。

static CChartWnd  chartWnd;
这句话定义了一个CChartWnd类的变量chartWnd

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

现在下课。