常见的波形图控件,如大厂的MsChart,TeeChart,国产的St-Curve等,大多都采用ActiveX控件的形式发布。
CChart的发布方式则是普通的Dll动态链接库。
这两种方式不好笼统地说哪个好哪个不好,各有各的应用场合。就笨笨个人来说,对ActiveX控件不太感冒,因为它需要操作注册表。
实际上,大多数情况下,普通的动态链接库都可以满足使用要求,且更方便。
但ActiveX控件的形式也有其优点,好些朋友也希望我能发布ActiveX控件版本的CChart。
为此,笨笨利用VC里面的ATL模板,开发了一个功能简化版的CChart。ActiveX控件需要采用COM技术,而笨笨对COM不太熟悉,所以这个开发一开始有点吃力。好在目前框架已经搭好,只需要往里面增加内容就可以了。目前,ActiveX版的CChart各项基本功能都已经具备,但添加的接口比较少,由于这个版本使用的人不多,暂时也没有大规模扩充接口的计划。
这一课就介绍一下CChart的ActiveX模式。
首先请在www.cchart.net网站下载CChart控件版PlotCom.7z,并把这个文件解压到合适的位置。实际上,我们需要的只是PlotCom.dll这个文件。
A25.1 控件注册和反注册
要使用ActiveX版本,必须在Windows系统中注册这个控件。注册方法是打开CMD命令窗口,一路cd到PlotCom.dll文件所在位置,然后输入如下命令。
regsvr32 PlotCom.dll
不出意外的话,系统会弹出如下对话框,表示注册成功。
当然,如果不想继续使用ActiveX版的CChart了,可以进行反注册。
Regsvr32 /u PlotCom.dll
这时会弹出如下对话框,表示反注册成功。
A25.2 VC调用
第一步,用VC建立一个基于对话框的MFC程序LessonA25,一路采用默认选项。
第二步,在VC资源管理器中打开主对话框,删除上面的标签。点开右键菜单“Insert ActiveX Control…”。在对话框里找到PlotCtrl Class,然后点击OK。
第三步,在主对话框里,调整控件大小和位置。
第四步,右键点击控件,选择“ClassWizard…”,在MFC ClassWizard对话框里进入Member Variables选项卡,选择IDC_PLOTCTRL1,然后点击“Add Variable…”按钮。
第五步,在弹出的对话框里点击“确定”、OK,取变量名为m_ctrlPlot。
这时候,项目里面会自动生成plotctrl.h和plotctrl.cpp两个文件。
在plotctrl.h文件里面,可以找到目前在PlotCom控件里面,已经加入的接口函数。
这些函数基本就等同于CChart类的成员函数,当然目前还只是CChart类成员函数的一小部分,有待继续扩充。
一些函数和CChart类的成员函数同名,参数也相同。另一些函数名的末尾添加了_S,这些函数的参数都是变体量VARIANT。
一般情况下,直接用不带_S的函数就可以了。带_S的函数主要是用于那些弱类型的语言,如VBScript等,这里就不展开说了。
第六步,打开LessonA24Dlg.cpp文件,在OnInitDialog()函数里面,找到“// TODO: Add extra initialization here”这一行,在其下面添加代码。
m_ctrlPlot.SetType(6);
m_ctrlPlot.SetFieldFcn((long)&FieldFcn);
m_ctrlPlot.SetPlotRange(-2, 2, -2, 2);
m_ctrlPlot.SetTitle(_T("ActiveX控件"));
注意到等高线云图的代号是6,这个需要到Chart.h中查询。
还要注意,ActiveX控件版中,SetFieldFcn的输入参数是long型的,但这里实际需要输入的是一个函数指针。
第七步,在OnInitDialog()之前,添加场函数的定义。
double FieldFcn(double x, double y)
{
return 1.0/((x-1.5)*(x-1.5)+(y-0.8)*(y-0.8)+1.0)
+1.0/((x+1.5)*(x+1.5)+(y-0.8)*(y-0.8)+1.0)
+1.0/(x*x+(y+0.8)*(y+0.8)+1.0);
}
好了,打完收工,效果如图。
这里,笨笨是在VC6下演示的。实际上,在高版本下的使用方法没有本质区别。