窗口是紫金桥组态软件的人机画面中非常重要的组成部分,是工程数据在计算机上与人互动的主要的手段之一。
在一个工程中,每个画面的名字是唯一的,并作为标识被脚本调用。画面以文件的形式存放在工程中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()以子窗口的方式新建多实例窗口。这样打开的窗口除具有多实例窗口的特征外还具有子窗口的特征。