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的物件上使用,你也可以利用它來進行視窗呼叫。