窗口是紫金橋組態軟件的人機畫面中非常重要的組成部分,是工程數據在計算機上與人互動的主要的手段之一。
在一個工程中,每個畫面的名字是唯一的,并作為標識被腳本調用。畫面以文件的形式存放在工程中doc文件夾下,每個畫面對應一個與其同名并以“drw”為擴展名的文件,如窗口“DRAW1”對應為“DRAW1.drw”文件。該文件存儲了該窗口的大部分內容,一般來講,該窗口文件拷貝到其他工程下的doc文件夾下就可以直接進入組態使用。只有當畫面引用了圖片或圖形模板時,則需要將相應的文件同時拷貝。
窗口按類型可分為:覆蓋窗口、彈出式窗口和頂層窗口。
窗口按運行時的打開方式可分為:普通打開、被動隱藏打開、子窗口、模態窗口、多實例窗口。本文主要講述這幾種打開方式的使用。
1.普通打開
普通模式打開就是使用窗口函數Open()或者在view.exe中手動打開窗口,這時需要注意的是,如果窗口具有“打開其他窗口時自動關閉”屬性,那么同類型的其他窗口會被關閉,只留下當前窗口。
2.被動隱藏打開
當窗口中元素(如:窗口函數、窗口變量、窗口對象等)被窗口外環境(如:全局腳本、其他窗口內腳本等)引用時,該窗口會被動打開,并且隱藏。這是因為窗口元素的存在是以窗口打開為前提的,窗口本身是窗口中所有元素的載體,因此窗口外環境引用本窗口元素時,系統必須打開本窗口才能使其生效。這種方式打開的窗口除以隱藏方式打開外,其他特性與普通方式打開一樣。
需要注意的是,即使是被動隱藏打開,該窗口的窗口進入腳本、周期腳本、退出腳本以及窗口內其他對象的腳本或者動畫鏈接等所有動作仍會生效。
3.子窗口
子窗口打開是指以窗口函數OpenChild()方式打開窗口。例如:
#DRAW1. OpenChild(“DRAW2”);
這句腳本的作用是將窗口DRAW2以窗口DRAW1的子窗口方式打開,也就是說,窗口DRAW1是窗口DRAW2的父窗口。那么這兩個窗口間有著怎樣的關系呢?
它們間的關系取決于子窗口的類型。如果窗口DRAW2為覆蓋式窗口,那么窗口DRAW2的存在依賴于其父窗口DRAW1,簡單地說就是如果窗口DRAW1被關閉了,那么窗口DRAW2會自動關閉。而且,窗口DRAW2只能顯示在窗口DRAW1的范圍內,超出該范圍的部分不顯示,看上去就像窗口DRAW1中的一個組件一樣。再者,如果父窗口被移動,則子窗口隨之移動。如果將窗口DRAW2的標題欄和系統菜單去掉,那么窗口DRAW2則被完全嵌入其父窗口中,不能使用鼠標移動。
下表列出了不同類型子窗口與父窗口間的關系。

4.模態窗口
模態窗口就是以窗口函數DoModal()的方式打開的窗口。不同類型的窗口都能以模態窗口的方式打開。并且,模態窗口打開以后,整個view.exe程序的焦點落在該窗口上,只有當該窗口被關閉后焦點才能釋放。執行窗口函數EndModal()后,等同于關閉該窗口,該窗口內所有數據均被銷毀。該種窗口的使用在紫金橋聯機幫助中有詳細講解,不再贅述。
5.多實例窗口
多實例窗口是以窗口函數New()的方式打開的窗口。函數New()的作用是以多實例的方式新建一個窗口,并且可以同時創建多個窗口實例。例如:
int nWinID1 = #DRAW1.New(1);
int nWinID2 = #DRAW1.New(1);
這兩句腳本的功能是,以窗口DRAW1為模具分別創建兩個實例窗口并且打開,新創建的窗口實例句柄分別返回給整型變量nWinID1和nWinID2。這兩個窗口可以看做是窗口DRAW1的兩個副本,相當于復制了窗口DRAW1的所有內容,并且各自獨立運行,互不干擾。這樣做的目的是為了在運行時滿足同一種算法實現存儲不同中間結果的需要。當多個實例存在時,可以通過窗口函數Use(int
nWinID)在同一個窗口的不同實例間切換,使用該函數后,會將指定實例句柄的實例窗口設置為當前實例窗口。
注意:在運行時,同一時刻只有一個當前實例窗口。在不使用函數Use()時,最后一個生成的實例窗口為當前實例窗口,因鼠標點擊等原因而獲取焦點的實例窗口也會成為當前實例窗口。
在多實例窗口存在的情況下,腳本中所有針對該窗口名字的操作或者引用均生效于當前實例窗口,與非當前實例窗口無關。
另外,可以使用窗口函數NewChild()以子窗口的方式新建多實例窗口。這樣打開的窗口除具有多實例窗口的特征外還具有子窗口的特征。