http://labview360.com/article/info.asp?TID=10152&FID=165
Active X函式库
对使用LabVIEW作为开发环境的开发人员来说,如果能呼叫或引用其他程式所开发的物件如:OCX、DLL…等。不仅能够缩短开发时间,更能随心所欲的设计出所需要的功能。毕竟在LabVIEW的开发环境下或多或少还是会有所限制,例如:如何用LabVIEW制作常注程式,也就是将程式放到System Tray上呢?LabVIEW为了解决这样的问题,针对Active X物件提供了Active X函式库,使用这些函式库里的元件来引用现有的Active X物件。
图1.1 LabVIEW提供的Active X函式库
不单单在Block Diagram函式库上,在Front Panel上也可以利用Active X Container控制元图1.2来引用ActiveX控制项。
图1.2 LabVIEW提供的Active X Container控制元
Active X物件的属性方法及事件
在讨论如何使用ActiveX前,我们先来针对元件的属性,方法及事件来做一个简单的说明。属性(Property),就是指该元件的外观,例如元件大小、外观颜色、Label名称…等。要改变元件属性,除了在设计阶段在Front Panel改变之外,还可以利用Property Node 图1.3来指定。
图1.3 Property Node
方法(Methods),取得该元件的某种活动功能,例如:启动或移除DataSocket动作,使用者可利用Invoke Node 图1.4来决定该元件要做何种功能。在最后的制作常驻程式范例中将会针对这个部分再做说明。
图1.4 Invoke Node
事件(Events),每一个物件都会有它自己的动作,最常见的就是Mouse Down,Value Change…等。换句话说,就是该元件现在正在发生的行为。要取得Events的发生,可以利用Events Structure进行事件触发图1.5。但是,这是针对于在
图1.5 Events Structure
Front Panel上的UI(User Interface)元件所进行的,对于Active X就没法使用这种方式取得Events事件,而必须跟Register Event Callback相配合来取得ActiveX的触发事件图1.6
图1.6 Register Event Callback
在了解ActiveX物件的属性方法及事件后,我们再来简单说一下Event事件。在Event事件上我在这里把它分为二种模式,附带说明一下在LabVIEW的Event模式里不单单这二种,为了让大家很清楚的分辨这二种Event的差异性,所以我只针对这二种方式做说明。一种是UI触发的Event事件,另一种是非UI触发的Event事件。UI触发的Event事件,简单的说就是在人机介面上利用滑鼠游标或键盘来改变人机介面上元件的参数,或是Mouse Down、Mouse Up、Key Up…等,状态改变时,所触发的Event事件,这样的Event事件,我把它称为UI触发的Event事件。非UI上的Event触发何谓非UI上的Event触发呢?举例来说,如果我在UI上放置2个Boolean控制元一个是Button(Trigger)另一个是LED(Read Event)。而我所要的功能是当Button按下时,改变LED的参数(True或False)。由LED的Value改变来触发Events Structure,藉由LED的触发去呼叫Dialog视窗。如果使用图1.7的方式是没办法达到上述所需要的功能。因为,Events Structure只能在Front Panel上的元件被使用者改变时,例如使用者按下Front Panel上的按钮或键盘输入Numeric的参数…等,以这样的方式改变参数,才有办法执行Events Structure里的Event程序。
图1.7 无法触发Read Event
而要达到非UI上的Event触发,就必须如图1.8一样利用Register Event Callback及Callback Vi来使Read Event LED改变状态,利用这样的方式来触发Read Event里的Value Change程序。
图1.8 以Register Event Callback方式触发Read Event
也就是在程式一开始执行的时候,会先注册一个Callback Events,在Callback Vi里,先取得Read Event的Reference的Value(Signaling)及Value。
图1.9 Callback Vi
当Trigger Value被改变时,会先执行Callback Vi,然后将参数传给Read Event
图1.10 触发Read Event Value Change程序
Reference的Value(Signaling) 图1.9。透过这样的改变再去触发Event Structure里的Read Event(Value Change)程序图1.10。各位或许会问;为什么要提到非UI触发的Event事件呢?使用ActiveX物件跟Register Event Callback又有什么关系呢?在制作常驻程式的章节里,除了要使用ActiveX元件的属性及方法外,还必须取得滑鼠在System Icon上的触发事件,如果没办法取得滑鼠触发事件,那么常驻程式的功能也就没法完成。
开始之前
在ActiveX物件之一的章节里,我们针对ActiveX及Event部分做了些许说明。接下来,利用实际的ActiveX元件及上一章节所书的部分作一个结合,来设计一个常驻程式。所谓常驻程式就是在各位电脑萤幕右下角出现的小图示图2.1,当你游标移到该位置的某一个Icon并且按下滑鼠上的按钮时,相对应的程式会显示画面或是进行其他动作。
图2.1 System Tray Icon
而我们就利用STI Control这个ocx元件,来设计一个类似这样一个功能的程式。在这开始之前,你必须先复制STI.ocx 图2.2并进行注册在你的电脑里。
图2.2 STI.ocx
完成以上步骤后,就可以开始进行常驻程式的制作了。
如何引用STI Control元件
引用ActiveX的方式除了在Block Diagram上使用ActiveX物件外也可以直接在Front Panel上直接指定STI Control元件。步骤一,在Control控制面板上图2.3,建立一个ActiveX Container元件并在
图2.3 ActiveX Container
ActiveX Container上按滑鼠右键,选择Insert ActiveX Object选项图2.4。
图2.4 Insert ActiveX Object选项
步骤二,在Select ActiveX Object视窗里,选择STI Control元件图2.5。当然,你也可以利用这种方式引用其他ocx元件。步骤三,完成后,按下OK按钮。在Front Panel及Block Diagram上就会出现STI Control元件图2.6。
图2.5 Select ActiveX Object
图2.6 STI Control元件
设定属性及方法
在之前的讨论中,可以利用Property Node及Invoke Node分别指定该元件的属性及方法。步骤一,在这个范例中,分别指定出现在右下角图示的方式,图示的位置及由标移动到图示上所出现的文字。
步骤二,完成属性设定后,在程式一开始执行时,我们利用Invoke Node的Appear方式,将图示放到System Tray上。
步骤三,在程式结束时,增加一个Invoke Node的Remove在程式的最后,这个Remove作用是将出现在System Tray上的图示移除。如果没有这个步骤,当程式停止执行后,图示将不会被移除。
完成上述步骤后,执行程式。查看在System Tray上出现ROCKET的Icon,将游标指向ROCKET Icon,则出现STI System tray Test的提示文字。
当然,这样的结果还不能说是完成,因为光是把Icon放到System Tray上是不够的,还必须搭配滑鼠的按钮动作来取得事件。
利用Callback Vi取得Events事件
步骤一,在Block Diagram上新增一个Register Event Callback Node,并且将STI的ActiveX Object指向Event。
步骤二,选择STI的DbClick作为Event的触发条件。
步骤三,新增一个名为Event的Boolean Indicator。建立一个Boolean的Reference并指向User Parameter接点上。
步骤四,在Register Event Callback Node的VI Ref接点上,按滑鼠右键。在
选单上选择Create Callback Vi选项,建立Callback Vi。
步骤五,在Callback Vi的Block Diagram里,产生Event的Property Node,Value及Value(Signaling),并且用NOT作反向。需要这样做是要让Boolean有ON及OFF的参数变化。
步骤六,接下来就是试试看程式执行的结果,当滑鼠游标在ROCKET Icon上按下Double Click时,Event的LED会做ON(OFF)变化。当你停止程式时,ROCKET Icon会消失不见。结论这里所讨论的都是比较基本的用法,在实际的使用上你也可以引用不同的ocx
物件来设计你的程式。在Register Event Callback Node的使用上不单单在ActiveX的物件上使用,你也可以利用它来进行视窗呼叫。