窗口是紫金橋組態軟件的人機畫麵中非常重要的組成部分,是工程數據在計算機上與人互動的主要的手段之一。
在一個工程中,每個畫麵的名字是唯一的,並作為標識被腳本調用。畫麵以文件的形式存放在工程中doc文件夾下,每個畫麵對應一個與其同名並以“drw”為擴展名的文件,如窗口“DRAW1”對應為“DRAW1.drw”文件。該文件存儲了該窗口的大部分內容,一般來講,該窗口文件拷貝到其他工程下的doc文件夾下就可以直接進入組態使用。隻有當畫麵引用了圖片或圖形模板時,則需要將相應的文件同時拷貝。
窗口按類型可分為:覆蓋窗口、彈出式窗口和頂層窗口。
窗口按運行時的打開方式可分為:普通打開、被動隱藏打開、子窗口、模態窗口、多實例窗口。本文主要講述這幾種打開方式的使用。
1. 普通打開
普通模式打開就是使用窗口函數Open()或者在view.exe中手動打開窗口,這時需要注意的是,如果窗口具有“打開其他窗口時自動關閉”屬性,那麼同類型的其他窗口會被關閉,隻留下當前窗口。
2. 被動隱藏打開
當窗口中元素(如:窗口函數、窗口變量、窗口對象等)被窗口外環境(如:全局腳本、其他窗口內腳本等)引(yin)用(yong)時(shi),該(gai)窗(chuang)口(kou)會(hui)被(bei)動(dong)打(da)開(kai),並(bing)且(qie)隱(yin)藏(zang)。這(zhe)是(shi)因(yin)為(wei)窗(chuang)口(kou)元(yuan)素(su)的(de)存(cun)在(zai)是(shi)以(yi)窗(chuang)口(kou)打(da)開(kai)為(wei)前(qian)提(ti)的(de),窗(chuang)口(kou)本(ben)身(shen)是(shi)窗(chuang)口(kou)中(zhong)所(suo)有(you)元(yuan)素(su)的(de)載(zai)體(ti),因(yin)此(ci)窗(chuang)口(kou)外(wai)環(huan)境(jing)引(yin)用(yong)本(ben)窗(chuang)口(kou)元(yuan)素(su)時(shi),係(xi)統(tong)必(bi)須(xu)打(da)開(kai)本(ben)窗(chuang)口(kou)才(cai)能(neng)使(shi)其(qi)生(sheng)效(xiao)。這(zhe)種(zhong)方(fang)式(shi)打(da)開(kai)的(de)窗(chuang)口(kou)除(chu)以(yi)隱(yin)藏(zang)方(fang)式(shi)打(da)開(kai)外(wai),其(qi)他(ta)特(te)性(xing)與(yu)普(pu)通(tong)方(fang)式(shi)打(da)開(kai)一(yi)樣(yang)。
需要注意的是,即使是被動隱藏打開,該窗口的窗口進入腳本、周期腳本、退出腳本以及窗口內其他對象的腳本或者動畫鏈接等所有動作仍會生效。
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的de所suo有you內nei容rong,並bing且qie各ge自zi獨du立li運yun行xing,互hu不bu幹gan擾rao。這zhe樣yang做zuo的de目mu的de是shi為wei了le在zai運yun行xing時shi滿man足zu同tong一yi種zhong算suan法fa實shi現xian存cun儲chu不bu同tong中zhong間jian結jie果guo的de需xu要yao。當dang多duo個ge實shi例li存cun在zai時shi,可ke以yi通tong過guo窗chuang口kou函han數shuUse(int nWinID)在同一個窗口的不同實例間切換,使用該函數後,會將指定實例句柄的實例窗口設置為當前實例窗口。
注意: 在運行時,同一時刻隻有一個當前實例窗口。在不使用函數Use()時,最後一個生成的實例窗口為當前實例窗口,因鼠標點擊等原因而獲取焦點的實例窗口也會成為當前實例窗口。
在多實例窗口存在的情況下,腳本中所有針對該窗口名字的操作或者引用均生效於當前實例窗口,與非當前實例窗口無關。
另外,可以使用窗口函數NewChild()以子窗口的方式新建多實例窗口。這樣打開的窗口除具有多實例窗口的特征外還具有子窗口的特征。