第七章 建立用户接口
CH7.zip(96KB)
在本章中,使用用户接口工具箱建立一个用户接口。
在本章中,你:
启动AVS/Express
创建一个窗口
增加一个菜单条
增加一个文件选择对话
增加一个退出确认对话
在一个宏中封装用户接口
7.1 介绍
用户接口工具箱使你能够为你的应用程序建立复杂的用户接口。用户接口可以包括窗口、对话、菜单条、附件(域、列表框,等等)、标记和公用对话(文件选择对话、信息对话,等等)。你所建立的接口在UNIX和Windows系统中都能工作。
在本章中,你为EchoSounding应用程序建立一个用户接口。这个接口使用户能够选择数据文件和退出应用程序。
本章说明:
怎样从由工具箱提供的基本对象中建立组件。你在本章中所用的技巧——了解有关这个工具箱对象的必要信息,实例化和连接对象,以及设置对象的参数——同样可应用于其它的AVS/Express工具箱。例如,用图形显示工具箱,你可以装配基本对象来创建一个客户数据视图。
怎样封装一组网络中的对象到一个宏中。
7.2 启动AVS/Express
如果你不在AVS/Express中,现在用myproj项目启动它。
UNIX系统
express –project myproj
Windows:
bin\pc\express –project myproj
根据你存储myproj的地方,你可能有必要指明路径名。
AVS/Express开始工作并装入你的项目。
如果你从上一章就在AVS/Express中,删除当前的应用程序工作区,并装入一个新的应用程序工作区。
为了删除当前的应用程序工作区,选择File->Delete Application下拉命令。
为了装入一个新的应用程序工作区,选择File->New Application下拉命令,从New Application对话框中选择Application,然后点击OK。
7.3 创建一个窗口
在本节中,你创建这个用户接口的窗口。
进入用户接口库页。
实例化UIapp到DefaultApplication工作区中。
UIapp在Containers库中。
AVS/Express执行这个对象。一个空窗口出现在屏幕上。这里是它的一部分:
移动UIapp窗口到AVS/Express Network编辑器旁边。

那样做,窗口不会防碍其它的窗口。
打开UIapp对象,向下滚动到title参数。
打开title,然后改变title的值为常量“Echo”。
记住用引号封住常量,并按Enter应用这个变化。
在你按Enter之后,AVS/Express会在常量前插入一个连接操作符(=>)。你可以忽略它。
注意窗口有你指定的标题:
(注意当你实例化UIapp时,title参数被连接到表达式name_of(<-)。这就设置窗口的标题为title的父对象的名字UIapp。这就是为什么当你实例化UIapp时,窗口的标题也是UIapp。)
上下滚动UIapp,观察它的不同参数。
例如,参数x、y、width和height让你指定窗口的位置和大小。visible参数确定这个窗口是否显现;它当前设置为1,意思是窗口是可见的。
工具箱的文件包括对工具箱中每一个对象的详细描述。你也可以得到一个对象的联机帮助。
为UIapp,选择Help弹出命令。
选择Help窗口的File->Exit下拉命令,清除联机帮助窗口。
在UIapp对象后面,滚动到visible参数,打开它,并设置它的值为0。
当你按Enter应用这个变化时,Echo窗口消失。
改回visible的值为1。
窗口再出现。
关闭UIapp。
7.4 增加一个菜单条
在本节中,你增加一个菜单条到Echo窗口中。菜单条包括有下拉命令的File菜单。
增加菜单条本身
在DefaultApplication工作区中重新定位UIapp,例如垂直方向它在工作区的中心,水平方向它在中心偏右。
你将实例化和连接几个用户接口对象。象描述的那样定位UIapp会使所有对象很容易地定位在工作区上。
到后面,如果你超出了区间,你可以容易地重新定位到工作区上。例如你可以套住和拖拽对象。作为选择,你可以移动鼠标箭头到工作区上没有被占领的区域,然后按下Shift键和鼠标中键(在UNIX系统上)或鼠标右键(在Windows上)拖拽鼠标箭头。
实例化UIcmdList,并把它连接到UIapp。
UIcmdList在Menu Bar库中。
窗口现在有一个空的菜单条。(在Windows上,直到菜单上有一个菜单项时,才出现菜单条。)

考虑UIapp 和UIcmdList之间的连接。连接的目的不是引用UIcmdList的数据;UIapp不需要它。但是UIapp的更新方法确实需要一个指向窗口的菜单条的指针,如果有的话,这样它可以显示正确的UIapp。连接提供了这个指针。
增加一个菜单到这个菜单条中
实例化另一个UIcmdList对象,并连接它到第一个UIcmdList对象上。
窗口的菜单条现在有一个菜单项,这个菜单项当前设置为UIcmdList#1。
打开UIcmdList#1,并设置label参数为常量“File”。确定在名字的周围有引号标记。


当你按Enter时,窗口菜单的名字改为File。
关闭UIcmdList#1。
一个菜单一般包括几个菜单项,象File、Edit和Help。
相应地,你可以连接几个UIcmdList对象到菜单条的UIcmdList对象上。
实例化另一个UIcmdList对象,并连接它到菜单条的UIcmdList上。

窗口的菜单条现在有了第二个菜单项。

删除UIcmdList#2,你刚刚实例化的对象。
为了删除这个对象,选择Delete弹出命令。
换名UIcmdList#1为UIcmdListFile。

增加下拉命令到菜单中
File菜单需要Open和Exit命令。创建这些命令,在它们之间将出现分隔符。
实例化一个UIcmd对象,一个UImenuSeparator对象和另一个UIcmd对象,并如下所示的排列它们。
在这里描述的顺序中,把Uicmd与UIcmdListFile连接起来,然后再连接UimenuSeparator和 UIcmdListFile,最后连接UIcmd#1和UIcmdListFile。
连接对象到UIcmdListFile的顺序决定了它们在菜单中显示的顺序。

下拉Echo窗口的File菜单。

命令在当前被命名为UIcmd和UIcmd#1。
打开UIcmd,向下滚动看到label参数,并改变它为常量“Open…”。
按Enter应用这个变化,然后关闭UIcmd。
打开UIcmd#1,打开它的label参数,改变它为常量“Exit…”。
按Enter应用这个变化,然后关闭UIcmd#1。
下拉Echo窗口的File菜单。
现在菜单显示了你赋给的名字。
把UIcmd对象换名为UIcmdOpen。把UIcmd#1换名为UIcmdExit。
7.5 增加一个文件选择对话
用户接口工具箱包括各种公用对话,例如选择一个文件或显示错误信息的对话。为了使用一个公用的对话,只需简单地实例化它,设置合适的参数,以及把它连接到你的应用程序中。
在本节中,增加一个文件选择对话到你的用户接口中。然后研究探讨用户接口是怎样工作的。
增加对话框
从Dialogs库中实例化UIfileDialog,并定位它在UIcmdOpen之后。
连接这些对象,这样Echo窗口中的Open下拉命令带来一个文件对话。
如下所示把UIfileDialog连接到UIcmdOpen:
如果你前面试过选择Echo窗口中的File’Open下拉命令,文件选择对话现在将出现。选择Cancel按钮取消它。
你现在可以测试这个对话。
在Echo窗口,选择File->Open下拉命令。
出现一个文件选择对话。这里是它的顶端部分:
注意对话的名字是UIfileDialog。你可以赋予它其它更有意义的名字。
选择对话的Cancel按钮取消这个对话。
打开UifileDialog,设置title参数为“Select a Data File”。
为了一进入就能看到整个常量,你需要拓宽UIfileDialog。把UIfileDialog窗口的右下角向右拖拽。
记住用引号包住常量,并按Enter应用这个变化。现在你可以看到结果。
在Echo窗口中,再次选择File->Open下拉命令。
出现文件选择对话,有了新的标题。选择Cancel按钮。
观察UIcmdOpen 和UifileDialog是怎样工作的
在本节中,打开UIfileDialog 和UIcmdOpen看它们是怎样工作的。
打开UIfileDialog(如果你已经关闭了它)并滚动使你看到visible参数。
打开UicmdOpen并滚动使你看到do参数。
注意UIfileDialog.visible被连接到UIcmdOpen.do上。
下面是它们怎样工作的:
观察UIcmdOpen.do 和UIfileDialog.visible上的变化。
关闭UIfileDialog 和UIcmdOpen。
7.6 增加一个退出确认对话框

当你的应用程序的一个用户选择Exit命令时,这个应用程序将退出,但首先会显示一个确认对话。在本节中,把一个退出确认对话增加到你应用程序的用户接口中。
实例化UImessageDialog并把它连接到UICmdExit上,这样为visible参数输出输入端口。(正如你在上一节增加对话中为UIfileDialog所做的步骤2和步骤3一样,使用同样的处理过程。)
UImessageDialog在Dialogs库中。

连接UImessageDialog到UIcmdExit,如下图所示。
打开UImessageDialog,并滚动到ok参数。
这个参数当前没有值。 在Echo窗口中,选择File->Exit下拉命令。
出现一个消息对话。
注意当前对话没有一个有意义的标题,也没有描述信息。你很快可以增加这些。首先,当你选择OK按钮时,观察发生了什么事情。
选择OK按钮。
对话被取消,ok参数置为1。

在下一章中,你会把ok的输出连接到存在于AVS/Express中的一个模块上。作为准备,现在输出ok的一个端口。
为ok参数增加一个输出端口,然后输出这个端口。
为了增加一个输出端口,选择ok参数,并选择Add Output Port弹出命令。
一个端口被增加到参数的右边:
为了输出这个端口,直接移动鼠标箭头到这个输出端口上,然后选择下面显示的Export Port弹出命令。
这个端口现在扩展到模块的外边。

下面增加一个有意义的标题和信息。 滚动到title参数,打开它,并改变它的值为常量“Exit?”
记住用引号包住常量,然后按Enter。
在UImessageDialog中,滚动到message参数,并改变它的值为常量“Are you sure you want
to exit?”。
你必须拓宽UImessageDialog,才能看到你敲入的整个常量。
你现在可以看到结果。
在Echo窗口中,选择File’Exit下拉命令。
信息窗口反映你对标题和消息参数所做的改变。
选择OK或Cancel按钮取消这个对话。
关闭UImessageDialog。

注意UImessageDialog现在显示ok参数的输出端口。
记住通过选择一个对象的Info弹出命令,你总是可以确定哪一个参数是可进入端口的。
增加一个exit_process模块
AVS/Express为做一些像创建执行循环和计时器这样的手头的工作,提供一组一般目的的模块。一般目的模块之一叫做exit_process。正像它名字所说明的那样,exit_process退出表达式过程。你想要连接这个对象到你的应用程序中,但是你要保证它不会无意地执行。
在前一节中,如果你尝试了Echo窗口的File’Exit命令,并在信息框中选择了OK按钮,UImessageDialog的ok参数本来已经被置为1。然后,如果你把exit_process连接到EchoUI,exit_process会立刻执行,引起AVS/Express退出。
在本节中,增加exit_process到你的应用程序中。首先你要确保这样做是安全的。
重定位UImessageDialog,使它在UIcmdExit之下。
这样会使连接线更清晰。
打开UImessageDialog。
双击或选择Open弹出命令,打开一个组对象。
滚动到ok参数,验证它的值为空或为0。
值出现在参数名之后。空值作为一个问题标记出现。
如果值不为空或0,打开这个对象,置它的值为0,然后关闭这个对象。
关闭UImessageDialog。
现在准备增加exit_process。它在GMOD库的Templates库页上。但是如果你不知道它的地点怎么办?下面的指令会告诉你如何使用Object
Finder找到这个对象。
在Network编辑器中,选择Object->Find in All Libraries。
出现Object Finder。这里是它的顶端部分:

在Search Pattern域中,插入你查询的对象名。
对象名是exit_process(你可以键入空格来代替下划线)。不要使用引号。
选择Find按钮。
AVS/Express查询指定对象的所有事件。找到一个就显示在Object列表框中。对于开发者用户,列表告诉你exit_process在GMOD库的Templates库页上。
选择Show按钮。

AVS/Express显示和打开适当的库页和库,并加亮exit_process。
在Object Finder对话中,选择Cancel按钮。

实例化exit_process并连接到EchoUI,如下图所示。
继续到下一节,在一个宏中保存用户接口。但是首先,注意你使用过的构造一个用户接口的技巧:
从用户接口库中实例化对象,在库中每一个对象定义一个用户接口的特定方面。
用标准方式连接对象,建立你想要的功能。
设置对象参数,引导对象符合你的需要。
这与你在其它库中为其它对象组所用的技巧是一样的。
7.7 在一个宏中封装用户接口

宏是AVS/Express的一个标准对象。使用宏封装互相连接对象的网络。
在本节中,封装你刚刚建立的用户接口到一个宏中。
移动Network到一个宏中
进入标准对象库页。
实例化宏到DefaultApplication工作区。
宏在Macros库中。
注意宏处于打开状态,使你能够把对象移进里面。
在用户接口选择所有的对象。
选择多个对象的一种方法是选择一个,然后Shift-select其它(也就是说,当选择其它对象时,按住Shift键)。
另一种方法是使用套。在UIfileDialog上移动鼠标箭头,然后向下和向右拖拉鼠标箭头,创建一个叫做套的矩形区域。套应该完全或部分地包住你想要选择的所有对象。然后松开鼠标键。
Network编辑器用蓝色加亮选择的对象。在工作区中的所有对象,除了宏,都应该用蓝色加亮。
拖拉被选择的对象到宏中。
为了拖拉对象,移动鼠标箭头到一个被选择的对象上,然后拖拉它进入宏中。当宏变成粉红色时,你可以释放鼠标箭头。
把对象从一个容纳者对象(在这种情况下是DefaultApplication)移动到另一个的过程叫做再父亲化。现在对象有了一个新的父对象,宏。
最大化宏,可以看见和再定位它的子对象。但首先你要为宏更名。

选择宏对象,并使用Rename弹出命令转换它的名字为EchoUI。
最大化EchoUI。
为了最大化这个对象,移动鼠标箭头到EchoUI的标题条上,并选择Maximize弹出命令。
EchoUI现在占据了整个工作区。标题条是DefaultApplication。EchoUI,表示你正在查看EchoUI对象,位于DefaultApplication中。
很多对象可能在工作区中是不可见的。
移动EchoUI中的对象使它们都可见。
为了移动所有的EchoUI对象,包括你当前看不见的对象,在EchoUI内没有被占的区域定位鼠标箭头。然后按住Shift键和鼠标中键(在UNIX系统上)或鼠标右键(在Windows中)拖拉鼠标箭头。
你现在应该能够看见所有的EchoUI对象。

输出文件对话端口
你可以在宏外输出端口,与你能对模块或组对象输出的方式非常相像。输出一个对象的端口允许你在你的应用程序中把这个对象连接到其它对象上,这就是你在下一章将要做的。
输出UIfileDialog的输出端口到EchoUI宏的外面。这使得包括在文件对话中所选择的文件名的一个字符串文件名参数,可以进入宏外面的其它的对象。
你可以用两种方式之一输出端口:
移动鼠标箭头到端口,然后选择Export Port弹出命令。
从端口到宏的顶端或底部画一条连接线。对于输入端口,你画一条连接线到宏的顶端。对于输出端口,画一条连接线到宏的底部。
下面的图显示了结果。(注意AVS/Express窗口的高度已被减少,以使你看到的屏幕占据更少的空间。你不必减少你的AVS/Express窗口的高度。)
关闭EchoUI。

移动鼠标箭头到EchoUI的标题条上,然后或者双击它,或者选择Close弹出命令。
保存EchoUI为一个模板
进入Library Workspaces页。
从DefaultApplication拖拉EchoUI到Workspace 1。
保存你的项目。
选择Project->Save。
这一章结束。
或者停留在AVS/Express中继续下一章指南,或者选择File->Exit退出AVS/Express。
7.8 更多的信息
参看《AVS/Express工具箱》指南的第7章。
|