前面在VB里面画曲线,的确是非常简单。
那么,等高线图呢?
当然,如果是用控制点来画等高线,仍然是非常简单的。笨笨已经添加了需要用到的几个接口函数,大家用上一课的方法调用毫无问题。
如果是用场函数来画等高线,那就涉及到一个函数指针的问题了。VB6下使用函数指针,没有C++下面那么方便直接了,限制比较多。关于VB6的函数指针,可以找到几篇很长的文章,对此专门进行介绍。
但不管怎么说,VB6是支持函数指针的,AddressOf这个操作符,就是我们使用函数指针的屠龙宝刀。
另外,VB6下编写的函数,其调用约定都是_stdcall。CChart是用VC开发的,内部函数基本上都是使用默认的_cdecl约定,等高线图的场函数,也需要_cdecl约定的函数。
为此,笨笨专门在CChart中增加了输入_stdcall约定场函数的接口,这样VB6就方便了。
下面仍然用例子说话。
第一步,和上一课一样,建立一个标准EXE工程,添加PlotCom控件后,在主窗口上放置一个PlotCom控件,并调整窗口到合适大小。
第二步,选择菜单“工程”-->“添加模块”,在模块窗口中输入如下代码,并另存为Module1.bas文件。
Public Function Field(ByVal x As Double, ByVal y As Double) As Double
Field = 1 / (x * x + y * y + 1)
End Function
这实际上就是用Basic写的场函数。
为什么要添加一个模块呢?这是由于VB规定,函数指针操作符AddressOf只能针对模块内的函数或者类模块的函数进行操作,不能操作窗体代码里的函数。
第三步,在Form1窗体的代码窗口内,添加如下代码。
Private Sub Form_Load()
PlotCtrl1.ChartType = 6
Call PlotCtrl1.SetFieldFcnStdCall_S(AddressOf Field)
Call PlotCtrl1.SetPlotRange_S(-3, 3, -2, 2)
End Sub
这里SetFieldFcnStdCall_S就是最近专门为_stdcall约定的场函数添加的接口。_S后缀仍然表示此接口适用于弱类型语言。
代码已经写完了,得到的结果如图。
可以看到,这一课还是一如既往的简单。当然这么简单的原因是笨笨已经把大量的细节处理好了。世上那有什么岁月静好,只是有人替你负重前行。