计算机应用研究
APPLICATION RESERCH OF COMPUTERS
2000  Vol.17　No.1　P.102-103




基于ActiveX的多通道数据曲线编辑控件的实现
彭莉辉　吴鸿修
摘 要 提出了基于ActiveX的多通道数据曲线编辑控件的设计思想，并详细讨论了其具体实现方法，同时给出了该控件的应用实例，说明了使用该控件的优越性。
关键词 ActiveX 控件 多通道数据曲线
1 引言
　　随着计算机软、硬件技术的迅速发展，越来越多的用户开始使用计算机来观察和处理数据。在常见的各种数据采集装置中，最后得到的数据通常是以16位二进制的格式存放在一个纯文本的文件中。众所周知，人的大脑在图形识别方面特别敏感，当数据以图形形式显示时，用户可以很快地从中提取所需的信息。对于数据的曲线显示与编辑的要求也应运而生，同时也出现了一些相关的控件，但这些控件通常没有考虑到来自多个通道的数据曲线显示问题，也没有提供标尺，而在实际应用中，这些对于用户都是非常重要的。如我们在研究大脑神经网络时，就需要一个能显示、分析多通道数据的控件。本文将详细讨论一个基于ActiveX的数据曲线编辑控件LabCurve.ocx的具体实现方法。
2 ActiveX控件
　　ActiveX是一种标准，利用这个标准可以使通过不同语言开发的软件构件在单机或网络环境中相互操作。同时，ActiveX也是以组件对象模型为基础的开放技术的集合，它代表了应用程序与Internet的一种集成策略。ActiveX组件最常用的有三种：控件(Control)、自动化服务器(Automation Server)和文档(Document)。ActiveX控件作为一种可重用的组件，相当于一个封装好的代码模块，通过其方法、属性、事件与应用程序进行通信。ActiveX控件是一种特殊的OLE控件，它不仅可以在支持OLE控件的容器中使用，更可以作为一个Internet控件，直接成为网页的一部分。ActiveX控件的开发可以用各种语言，如：VB、VC等，ActiveX控件的使用也可以是不同的语言和工具，如Delphi、IE等。
3 控件的主要功能
3.1 数据的采集
　　不管所用的数据采集装置为何种，只要数据采集装置通过与硬件相配套的软件将数据存放在一个缓冲区，即可调用Record方法将数据保存在所选的文件中。数据文件以16位二进制的格式存放所采集到的数据，为保持控件的通用性，文件中并不包含通道数等与采集相关的信息。
3.2 数据的波形显示
　　用户可以根据自己的研究需要，动态调整实际显示的通道数。并可将不同通道的数据的幅度以不同的比例缩放，在不同的幅度范围内观察。基于数据是多通道同时采集的，为方便研究数据的时间相关性，所有通道均以相同的时间比例显示相同时间区域的数据。当然，显示时间比例和时间区域都是可调的。为突出观察某些重要通道，还可调整每一通道的显示区域大小。同时，还可动态调整整个控件窗口的尺寸大小，便于来自不同文件的数据进行比较。
　　为使数据的观察与分析更加直观，在显示区里，添加了两个标尺。每个标尺都带有一个可上下拖动的文本框，可左右拖动标尺。从标尺的文本框中迅速得到任意一点所在的时间和幅度大小，并可通过两个标尺进行简单的数据分析，例如通过两个标尺的时间差和两个标尺间的周期数得到两个标尺间数据的频率。同时，还可以通过标尺的小横线直观看出所在点幅度在整个曲线幅度中所处位置。
3.3 数据的编辑
　　用户可以随时将两个标尺移到当前的显示区域，也可迅速将曲线恢复最初的显示比例。我们还提供了将鼠标所选择的区域进行数据曲线的剪切、复制和粘贴的功能。另外，还提供了曲线波形的打印功能，可将数据曲线按当前的显示比例打印出来，以方便进一步地分析与研究。
4 基于ActiveX的实现
　　VC++5.0提供了四种开发ActiveX的选择：MFC、ActiveX模板库、BaseControl框架和建立自己的框架。最简便快捷的便是使用MFC，只需从File菜单中选择New命令打开New对话，在Projects选项卡中单击代表MFC ActiveX Control Wizard的图标。在后续步骤中，默认其选择，Control Wizard提问完毕后，基本的框架代码已经生成。
　　然而，我们还需要为控件添加属性、方法和消息处理程序函数，以实现所要求的功能。属性是控件和包容器内部的公共数据，它可以用来向对方描述自己。包容器可以读取该控件的属性，来了解它当前的状态，如果控件允许的话，还可以重写属性，以改变控件的行为。LabCurve的属性大部分为自定义属性。所谓自定义属性就是控件设计者想展现给包容器的数据。包容器通过调用MFC中作为Get和Set方法的函数来读写控件的属性，这些方法是由该控件导出的。用户在按鼠标右键所弹出的对话框中可以读取或改变相应权限的LabCurve的自定义属性。方法为ActiveX控件展现给包容器应用程序的函数，允许客户调用。消息处理函数完成了对外部动作的反应和控件的绘制，是整个控件的核心部分。
4.1 数据采集的实现
　　在Windows环境下，由于Windows的多任务性和数据采集的速度要求，同时考虑到当掉电时，所采集到的数据不应丢失，数据的采集应使用多线程。也就是说在一个线程中，通过与采集硬件相配套的软件将数据存放在一个缓冲区，在另一个线程中调用LabCurve的Record方法将数据保存在所选的文件中。文件名由FileName属性决定。文件中的数据依次来自各通道，例如，采集通道0至通道2的数据，则文件中的数据依次来自通道：0、1、2、0、1、2、0......。
4.2 多通道数据波形显示的实现
　　由于文件中并不包含与采集相关的信息，因此需要设置通道数、采样频率和各通道的增益大小，即通过改变控件的属性nChannelNum、nSampleFre和nGain，达到使控件能正确地从文件中读取和显示信息的目的。为突出重点，用户还可改变nChannelDisp属性，以动态调整通道的显示数目。
　　在控件内部，定义了n个数组(n=nChannelNum)。每个数组依通道数轮流从文件中读取数据，代表来自于一个通道的数据。所读取数据在文件中的位置由当前显示的时间区域决定，即由XLeftLimit和XRightLimit属性决定。
　　为了使不同通道的数据的幅度可以按不同的比例缩放，在不同的幅度范围内观察。在控件内部，每个通道都有一个有关幅度显示区域的SCROLLINFO类型和有关幅度缩放比例的成员变量。当用户改变某一通道的YTopLimit(Y轴顶端幅度)、YBottomLimit(Y轴底端幅度)属性，或按动垂直滚动条和垂直拉缩钮，就会引起相应通道变量的变化，从而使显示达到所需要求。
　　基于所有通道均以相同的时间比例显示相同时间区域的数据。控件内部只有一个有关时间显示区域的SCROLLINFO类型和有关时间缩放比例的变量成员。用户改变XLeftLimit、YRightLimit属性，或按动水平滚动条和水平拉缩钮，即会引起这些变量的相应变化，从而使显示达到所需要求。
　　为调整整个控件窗口的尺寸大小，在控件中构造了一个具有SBS_SIZEBOX样式的特殊滚动条，并对WM_SIZE消息进行了处理。当父窗口尺寸大小改变时，也可调用控件的Size方法使控件窗口的大小作出相应变化。
　　通过有关标尺的属性和nActiveChannel(当前通道)属性以及对鼠标消息的处理，使标尺能对用户动作作出正确反应。
　　采用对WM_SETCURSOR消息进行处理的方法，使得当拖动标尺、改变显示区域大小、改变控件窗口大小时，鼠标形状都会相应改变。
　　用户还可以根据自己的喜好，改变有关颜色、字体和X-Y轴坐标显示等属性，调整控件的外观显示。
4.3 数据曲线编辑的实现
　　在进行数据曲线的剪切、复制、粘贴时，使用了Windows的剪贴板。应注意如果位图被选进设备环境中，那么它就不能再被送到剪贴板中。在此，我们使用了两个位图解决了这一问题。
　　我们对OnDraw()和OnPaint()函数都重新进行了设计，在控件的Print方法和OnPaint()函数中都调用了OnDraw()函数，使得数据曲线按当前的显示比例打印出来。
5 应用实例
　　我们使用VC++5，利用LabCurve.ocx完成了一个神经网络电生理信息采集与分析系统。如图所示，窗口的中间即为LabCurve控件。此系统完成了神经网络电生理信息的采集、保存、显示和一系列的分析。由于使用了LabCurve控件，省去了一些繁琐的工作，使整个结构显得相当明了。我们所开发的细胞图象分析系统、膜片钳系统都采用了这个控件，有效提高了工作效率，缩短了整个开发过程。

6 结束语
　　本文详细介绍了基于ActiveX的多通道数据曲线编辑控件LabCurve.ocx的实现方法，并给出了其应用实例。ActiveX控件作为可重用代码组件，不仅应用广泛，还可节约开发时间。ActiveX控件将大量的细节隐藏起来，以简明的接口与用户交互，易于使用。对ActiveX技术的研究将成为新的热点和潮流。
彭莉辉（华中理工大学控制科学与工程系 武汉 430074）
吴鸿修（华中理工大学控制科学与工程系 武汉 430074）
参考文献
1，Beck Zaratian. Microsoft Visual C++6.0程序员指南. 北京：希望电脑公司, 1998
2，Jerry Anderson. Visual C++5 ActiveX编程指南. 北京：清华大学出版社, 1998
3，Peter Norton, Rob McGregor. MFC开发Windows 95/NT 4应用程序. 北京：清华大学出版社, 1998
收稿日期：1999年7月26日
