深入浅出CChart 每日一课——第二课 上一课代码分析,骨骼精奇之一点即通

在第一课中,笨笨编写了少量的代码。对CChart不熟悉的人对部分代码可能不能理解,下面给同学们解释一下。

第一段代码如下。

#include "Chart.h"
#if defined(_UNICODE) || defined(UNICODE)
#	pragma comment(lib,"CChartu.lib")
#else
#	pragma comment(lib,"CChart.lib")
#endif
using namespace NsCChart;

 这一段大家应该很好理解,这是C++的预处理。

首先包含头文件Chart.h。

然后根据是否编译Unicode版本选择不同的导入库。如果编译Unicode版本,即宽字节版,需要链接CChartu.lib这个导入库,运行的时候会载入CChartu.dll。如果编译非Unicode版本,即多字节版,需要链接CChart.lib这个导入库,运行的时候会载入CChart.dll。

注意,从4.0.0.1版本开始,CChart开始使用命名空间NsCChart所以以前的版本不需要上面最后一行,而新版是必须加上的。

另外,从4.2.0.0版本开始,只提供Release版本的库文件,不再提供Debug版本的库文件。和以前一样,仍然区分多字节版和宽字节版,分别是CChart.lib和CChartu.lib,所以上面的代码进行了判断。

第二段代码如下。

 static CChartWnd  chartWnd;

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

首先解释一下CChartWnd类。

为完成各种绘图操作,CChart类库中具有大量的类,绘图工作就由这些类完成。但CChart内部类的定义都是模板形式,使用不甚方便,故笨笨做了一个包装类CChart,隐藏了模板类的实现细节。

而CChartWnd类则是在CChart类的基础上实现的一个窗口类,建立这个类的目的是为了自动实现消息响应,减少同学们编写的代码量。CChartWnd同时是一个窗口,可以理解为MFC中的CWnd,当然它和CWnd没有关系,CChart整个类库都与MFC没有关系。

要用几句话完全解释清楚CChartWnd类是比较困难的,不清楚的同学可以在下载的CChart.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(double x, double y)同学们应该很好理解吧,在图像上增加一个数据点。

这里一共增加了7个数据点。

chartWnd.GetChart()->SetTitle(_T("Hello World,我的第一个CChart程序!"));

这句话设置图像的标题,也很好理解。

 

第四段代码如下。 

 		chartWnd.Detach();

这句话放置在消息WM_DESTROY的响应代码中。

前面在WM_CREATE消息中把chartWnd“粘”到了主窗口上,这里在程序退出前,把chartWnd窗口从主窗口上“取”下来。因为chartWnd已经接管主窗口的消息循环,退出程序时需要恢复原有消息循环。

其实这句话不写也没有关系,因为CChart内部在退出的时候也会自动调用它。@-@。

第五段代码如下。这段代码不是我们要编写的,而是我们要删除的。

 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已经接管主窗口的消息循环,这段话实际上不起作用,也就是聋子的耳朵——纯粹摆设了,所以删掉它。实际不删也没关系,只是笨笨有点洁癖,呵呵。

第二课结束,大家还有问题吗?有问题请打开CChart.7z文件里面的说明书看看。

下一课是激动人心的一刻,介绍CChart的消息响应,而且不需要编写任何代码。世界上有免费的午餐吗?见证奇迹的时刻就要到了。敬请期待。

现在下课。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值