欢迎光临散文网 会员登陆 & 注册

LabVIEW和LabWindows/CVI调用ActiveX控件的编程方法

2022-09-05 16:39 作者:江南拱桥夜  | 我要投稿

        LabVIEW是由美国国家仪器(NI)公司研制开发一种图形化的编程语言,它不仅是虚拟仪器软件开发的一种编程工具,同时也是一种通用的、完善的、开放的高级编程语言,并提供了强大的外部接口编程技术,如DLL技术、ActiveX技术等等,可以实现LabVIEW与C、Basic、Matlab等编程语言,甚至与外部应用软件(如Word、Excel等)之间的通信,合理使用这些接口技术,可以充分利用其它软件的优势,弥补LabVIEW自身的不足,编写出功能更加强大的应用软件。

        LabWindows/CVI是一个NI公司推出的交互式C语言开发平台,他类似于LabVIEW的高端版本,它的集成化开发环境、交互式编程方法、函数面板和丰富的库函数大大增强了语言的功能,主要应用在各种测试、控制、故障分析及信息处理软件的开发中。与LabVIEW一样,也提供了强大的外部接口编程技术,如DLL技术、ActiveX技术等等。可以实现与Matlab等编程语言,甚至与外部应用软件(如Word、Excel等)之间的通信。

        ActiveX控件基于COM服务器进行操作,且与开发平台无关,因此,在一种编程语言上开发的ActiveX控件无需任何修改,就可在另一种编程语言中使用。由于其可重用性的特点,目前,除操作系统本身提供的ActiveX控件外,在网络资源上也能得到相当多的ActiveX控件,可以帮助我们完成各种各样的软件开发任务。

       下面通过一个例子说明在LabVIEW和LabWindows/CVI平台中使用ActiveX控件编程的方法(以Chart控件为例)。

       Chart控件可以用于绘制各种图表,支持真正的三维显示,支持所有主要的图表类型。值和数据点可以用棒图、线段图、区域图、台阶图、饼图等形式显示。还具有标题、背景、图例、图形和脚注属性。

       使用Chart控件必须注册MSChart控件。注册方法:mschrt20.ocx下载放在目录c:\windows\syswow64目录下。CMD管理员运行,命令行中输入regsvr32 mschrt20.ocx,regsvr32 c:\Windows\SysWOW64\MSCHRT20.OCX(相应控件名)。

LabVIEW使用Chart控件

前面板中插入状态栏控件的方法为,在前面板“ActiveX容器”控件的右键菜单中选择“插入ActiveX对象...”命令,弹出“选择ActiveX对象”对话框,选择“Microsoft Chart Control”控件。如对于本例,右键菜单中选择“MSChart”-“Properties”,弹出如图所示的状态栏属性框。它是ActiveX控件本身提供的对话框,由ActiveX控件的开发者提供给用户使用的属性设置的工具,在这个工具中可以对所有的可写属性进行修改或查看。然后添加其它控件。

“选择ActiveX对象”对话框


ActiveX对象本身提供的属性设置

LabVIEW前面板设计

      本例VI程序运行前面板如图所示,在前面板上中间位置调用了操作系统提供的ActiveX控件——“Microsoft Chart Control”,当按下面板上相应的按钮,数据以相应的显示形式显示在界面上,点击“退出”按钮则退出程序。

前面板

        LabVIEW程序框图的代码实现:

        本例程序框图使用了事件结构,在事件结构中响应前面板的所有命令按钮的“值改变”事件。通过事件结构使数据点可以用棒图、线段图、区域图、台阶图、饼图等形式显示。部分程序框图如下:

程序框图

       其中左边的公式节点用于产生数据,利用“Microsoft Chart Control”控件的属性节点,通过对属性节点中的chartType选项来确定图形的显示形式。

       首先说明一下什么是属性,属性是指对象(如控件、VI或应用程序等)的特性,相当于C++类中的数据。具有“可读”、“可写”或“可读写”等操作方式。在程序框图中的属性节点函数上有一个小箭头,若在左边,表明该属性可写,若在右边,表明该属性可读。对于可读可写的属性,右键单击属性节点中的某个属性,可以在右键菜单中选择“转换为读取”或“转换为写入”,在两者之间进行切换。关于属性节点的生成不在本文论述的范围内。

       LabWindows/CVI使用Chart控件

       1      添加控件,面板右键菜单,选择Activex....,然后在对话框中选择“Microsoft Chart Control 6.0(其文件名为MSCHART20.0.OCX)”,添加到面板上。

         2      控件出现后,右键菜单,选择属性,Chart Type选择3D。

        3      右键菜单---》Generate ActiveX Control Driver创建控件驱动,也就是引入一堆操作头文件,否则无法编码操作。本操作实际上引入了fp和.h文件。本程序中引入的fp文件为MSCHART20.fp,h文件为:#include "MSCHRT20.h"。

           4      添加其它控件,然后编写其它控件的回调函数。前面板效果如图:

前面板

       LabWindows/CVI前面板设计

      本例VI程序运行前面板如图所示,在前面板上的中间位置调用了操作系统提供的ActiveX控件——“Microsoft Chart Control”,当按下面板上相应的按钮,数据以相应的显示形式显示在界面上,点击“退出”按钮则退出程序。

      LabWindows/CVI程序的代码实现:

部分代码

部分代码如下:

#include "MSCHRT20.h"

#include <cviauto.h>

#include <cvirte.h>          

#include <userint.h>

#include "chartsample.h"

static CAObjHandle objecthandle;

static int panelHandle;

//产生绘图数据

void getchart (void);

int main (int argc, char *argv[])

{

       if (InitCVIRTE (0, argv, 0) == 0)

              return -1;      /* out of memory */

       if ((panelHandle = LoadPanel (0, "chartsample.uir", PANEL)) < 0)

              return -1;

       GetObjHandleFromActiveXCtrl (panelHandle, PANEL_MSCHART, &objecthandle);

       DisplayPanel (panelHandle);

       RunUserInterface ();

       DiscardPanel (panelHandle);

       return 0;

}

int CVICALLBACK QuitCallback (int panel, int control, int event,

              void *callbackData, int eventData1, int eventData2)

{

       switch (event)

       {

              case EVENT_COMMIT:

                     QuitUserInterface (0);

                     break;

       }

       return 0;

}

 

int CVICALLBACK colum3d (int panel, int control, int event,

              void *callbackData, int eventData1, int eventData2)

{

       switch (event)

       {

              case EVENT_COMMIT:

                    

                     //产生3D棒图

                     MSChart20Lib__DMSChartSetchartType (objecthandle, NULL, MSChart20LibConst_VtChChartType3dBar);

                     getchart ();

                     break;

       }

       return 0;

}

 

void getchart (void)

{

       VARIANT myvariantarray;

       int myarray[3][4]={0};

       int i;

       int j;

      

       for (i = 0; i <= 2; i++)

       {

              for (j = 0; j <= 3; j++)

              {

                     myarray[i][j] = i + j;  

              }

       }

      

       //2维整型数组存储到VARIANT变量中

       CA_VariantSet2DArray (&myvariantarray, CAVT_INT, 3, 4, myarray);

       //VARIANT变量中数据显示到Chart控件中

       MSChart20Lib__DMSChartSetChartData (objecthandle, NULL, myvariantarray);

       //显示图标

       MSChart20Lib__DMSChartSetShowLegend (objecthandle, NULL, VTRUE);   

}

……

         其中void getchart (void) 函数用于产生数据并把数据显示到Chart控件中。

HRESULT CA_VariantSet2DArray (VARIANT *variant, unsigned int arrayType, size_t sizeOfDim1, size_t sizeOfDim2, const void *array)函数将2维整型数组存储到VARIANT变量中。*variant,用来存放VARIANT类型的指针;arrayType为数组数据类型;sizeOfDim1为第一维数组个数;sizeOfDim2为第二维数组个数;*array为原始数组指针。          MSChart20Lib__DMSChartSetShowLegend (CAO bjHandle objecthandle, ERRORINFO *errorInfo, VBOOL showLegend)函数用于表示是否显示图标。showLegendVTRUE VFALSE两种选择。

       结论

       由上面的例子可以看出,ActiveX控件类似于LabVIEW和LabWindows/CVI本身的控件,具有独立的显示界面,以及独立的属性、方法甚至事件,在系统中安装注册一个ActiveX控件后,操作系统中所有应用程序都可以使用这个控件,同时,LabVIEW和LabWindows/CVI语言调用ActiveX控件的编程也相对比较简单。


LabVIEW和LabWindows/CVI调用ActiveX控件的编程方法的评论 (共 条)

分享到微博请遵守国家法律