CHAR11 AML界面设1.docx
《CHAR11 AML界面设1.docx》由会员分享,可在线阅读,更多相关《CHAR11 AML界面设1.docx(36页珍藏版)》请在冰豆网上搜索。
CHAR11AML界面设1
第11章AML界面设计
AML除了提供一套程序设计工具以外,还提供了生成基于菜单的图形用户界面的能力,这为ARC/INFO程序员快速而高质量地创建自己的界面,满足最终用户的要求提供了强有力的工具。
本章首先图文并茂地介绍ARC/INFO提供的风格各异的各类菜单,然后详细地讲解各种菜单的设计方式,最后介绍设计美观实用的图形用户界面的一些基本原则。
§11.1基本概念
11.1.1AML菜单
菜单可以定义为一组选项表。
AML菜单系统使你可以方便地在终端上设计屏幕显示或固定在数字化板或数字化仪上的选项表中作出选择。
选择操作可以是在鼠标上按一个按钮,或是在数字化键盘、屏幕键盘上击一个键来选取某个选项。
选项通常是在你作出选择后由程序执行一系列动作。
动作通常可以是命令或指令的执行或者是对函数的求值,还可以是运行另一个AML程序、调用另一个菜单、传第一个值给一个命令,或者执行其他需要的简单或复杂的操作。
11.1.2AML菜单文件
AML允许你用菜单文件为具体应用建立菜单式用户界面。
一个菜单文件是一个文本文件,文本文件能够明确地定义屏幕显示和对菜单选取的方式。
菜单文件的第一行表明菜单类型,菜单文件有七种类型,分别代表七种风格不同的菜单,在文件中分别用1~7的7个数码来表示。
即:
1——下拉式菜单2——边条菜单
3——阵列菜单4——字母键菜单
5——数字化板菜单6——数字化仪菜单
7——格式菜单
AML菜单文件及其格式要在11.3节中详细讨论。
11.1.3菜单文件的命名与运行
菜单文件可以由一个带或不带.MENU扩展名的文件名来命名。
推荐菜单文件名采取.MENU扩展名后缀(例如MAIN.MENU,FORMS.NENU)。
这个.MENU后缀使菜单文件一目了然,也方便了对菜单文件处理和管理。
菜单文件由&MENU指令来激活和显示,其典型用法如下:
&MENU{&PULLDOWN|&SLIDERBAR|&MATRIX|&FORM}
&MENU{&KEY}{&FORCE}
&MENU{&DIGITIZER|&TABLET}{X1Y1X2Y2}{&FORCE}
例如:
Arc:
&MENUMAIN.MENU
或
Arc:
&MENUMAIN
运行一个名为MAIN.MENU的菜单文件。
§11.2菜单类型
AML有3组不同菜单,它们是屏幕菜单(screenmenu)、字母键菜单(keymenu)和纸上菜单(papermenu),每组菜单有不同的表现形式和选择方法。
11.2.1屏幕菜单
屏幕菜单出现在终端屏幕上,选择可以通过将屏幕光标移到选项上,执行一个“选取”来实现。
选择一经作出,出现下列可视的反馈信息:
①表明系统正在响应,命令正在执行;②一旦完成,表明命令已经执行完毕,可以进行另一次选取。
反馈的方式依系统不同而不同。
有4种不同类型的屏幕菜单,它们是阵列菜单(matrixmenu),下拉式菜单(pullpownmenu),边条菜单(sidebarmenu)和格式菜单(formmenu)。
⑴阵列菜单
阵列菜单外观为方框中的一组选项。
选项显示在屏幕上的一个行列矩阵上。
对于单行或单列来说,选项可以水平或垂直放置。
图11.1分别给出了水平放置的阵列菜单和垂直放置的阵列菜单的一个例子:
COUNTYDATABASE:
TaxSanitationPoliceFireParksQuit
上图:
水平放置的阵列菜单
COUNTYDATABASE:
Tax
Sanitation
Police
Fire
Parks
Quit
上图:
垂直放置的阵列菜单
图11.1阵列菜单
在一个阵列菜单中的所有选项将同时显示在屏幕上,顶行用作标题或空出,可以对选项作出选择。
⑵下拉式菜单
第二类屏幕菜单是下拉式菜单。
当调用这类菜单时,它的外观是一个长条,代表菜单选项的关键字或短语排列在上面(见图11.2)。
当你从菜单条做选择时,可能弹出一个子菜单(或称二级菜单)。
这些菜单看起来是似乎是从菜单条中拉下来的(见图11.3)。
你可以同样从子菜单选项上作出选择,但是这菜单上的选项不能再产生另一个子菜单。
下拉式菜单可以有标题行,标题行中的正文用&STRIPE指令指定。
图11.3下拉式菜单的子菜单
⑶边条菜单
第三类屏幕菜单是边条菜单。
当调用这类菜单时,它出现在屏幕的左边(如图11.4所示).
图11.4边条菜单
如果一个可视的选项有一相关联的子菜单,当选择该选项时,子菜单将弹出在屏幕上(如图11.4所示).
除了它的子菜单出现的方式不同之外,边条菜单与下拉式菜单十分相似,边条菜单的子菜单从父菜单选项的同行以及父菜单选项最右一列之后开始显示。
⑷格式菜单
第4类菜单是格式菜单,格式菜单是屏幕菜单中最复杂也是应用最广的一种,不仅每个格式菜单有一个独立的外观,而且菜单的外观可以随用户与菜单的交互而改变,格式菜单有许多优点,关于格式菜单,我们将在11.4节中详细讨论。
11.2.2字母键菜单
字母键菜单显示在屏幕上,通过按下字母键进行选取。
下面是一个典型字母键菜单的例子。
CountyDatabase
Makeaselectionbytypingtheindicatedletter
T—Tax
S—Sanitation
P—Police
F—Fire
K—Parks
Q—Quit
要选择Tax,输入字母T;选择Sanitation,输入字母S。
11.2.3纸上菜单
有两种纸上菜单数字化板菜单(tabletmenus)和数字化仪菜单(digitizermenu)。
纸上菜单实际上是固定在数字化板或数字化仪上的一张纸(或类似材料),纸上标出一些分区和选项。
纸上菜单分成一些栅格格网,它们由行或列标识,每个小格由X、Y坐标对唯一地定义。
下面是一个简单的数字化板菜单的例子。
编辑Coverage
删除线
存贮
编辑菜单
选取多个特征
加入
移动
键盘命令
编辑特征
弧
标识点
结点
纸上菜单通过将数字化板或数字化仪光标定位在纸上菜单相应区域,按下光标键来选取。
§11.3菜单文件
菜单通过菜单文件来定义和生成。
菜单文件是一个正文文件,由正文编辑器生成。
菜单文件的格式十分重要,因为它决定了菜单如何显示,以及选择后如何采取操作。
所有菜单文件的首行必须由菜单类型代码和注释文字组成,而且不可延续到下一行。
下面是菜单文件首行的一个例子。
1SampleMenuforCountyApplication
菜单类型代码如下:
1—下拉式菜单2—边条菜单
3—阵列菜单4—字母键菜单
5—数字化板菜单6—数字化仪菜单
7—格式菜单
11.3.1阵列菜单文件
阵列菜单文件的第一行是标准的菜单头,阵列菜单代码为3,下面是阵列菜单文件首行的一个例子。
3Demonstrationmatrixmenuforthecounty
阵列菜单的第二行用来规定菜单的风格和方位,第二行包含两个整数,第一个数或者为0或者为1,用来指定菜单的风格。
0指定阵列菜单为横排风格,横排风格菜单将占据尽可能的屏幕宽度,选项从左读到右;1意味着阵列菜单为竖排风格,竖排风格菜单使用尽可能高的屏幕高度,选项应该从上读到下。
第二个数表示菜单的方位,亦即菜单应显示在屏幕的哪一边,它可以取值为-1(左对齐),0(居中),或1(右对齐)。
菜单文件的第三行为菜单标题。
在菜单中标题显示在菜单选项之上。
如果不想要标题,该行需留空。
文件的余下部分定义菜单选项,由选项定义语句组成,这些定义语句又由两部分组成,第一部分为关键字或短语,用来定义选项的可视部分,第二部分为命令或值,用来定义选项的执行部分。
当选取这个选项时,启动执行部分执行,这种语句格式也适用于下拉式菜单和边条菜单,例如:
Sanitation&rTRUCKS.AML[date–dow]
上面的语句规定了单词“Sanitation”是菜单的可视部分,将出现在菜单中。
如果选择了“Sanitation”选项,则执行TRUCKS.AML程序,参数为[date-dow]。
如果有选项串包含空格,则必须用括号括住。
例如:
‘SanitationDept.’&rTRUCKS.AML[date-dow]
如果语句只包含一个关键字或短语,它将同时作为命令或值返回,例如下列语句用一个菜单选项QUIT离开菜单程序。
Quit
阵列菜单文件中选项语句可以从行中任何列开始书写。
下面的例子将显示一个水平定向和居屏幕中间的阵列菜单。
3Demonstrationmatrixmenuforthecounty
00
CountyDatabase
Tax&menuTAX.MENU&pulldown
Sanitation&rTRUCKS.AML[date–dow]
Police&rPINMAP.AML[response‘EnterDivisionNumber’]
Fire&rFIRE.AML
Parks&thread&create&menuPARKS.MENU&side&stripe‘ParksDept.’
Quit
11.3.2下拉式菜单文件和边条菜单文件
下拉式菜单文件的第一行是菜单类型代码为1的标准菜单头,边条菜单的代码为2。
例如:
2Samplemenuforcountyapplication
下拉式菜单和边条菜单的其余部分和阵列式菜单有同样的构成和格式。
每一个语句行包含选项可视部分的关键字或短语,后接选项执行部分的命令、指令或函数。
因为下拉式菜单和边条菜单可以包含子菜单,因此,选项语句的开始列位置决定了菜单选项是出现在主菜单还是出现地子菜单中。
出现在主菜单中的选项,语句必须从行中第一列开始书写,而出现在子菜单中的选项则需要将语句第一列空出。
如果要用一个空行来分离子菜单中的选项,可以给出一个带引号的空格作为菜单选项列出。
例如:
Parks
Facilities&rFAC.AML
’’
Maintenance&rMAINT.AML
Security&rSECURE.AML
下面是一个边条菜单的文件例子。
2Samplemenuforcountyapplication
Tax
Owner&menuOWNER.MENU&pulldown
Address&typeNotimplementedyet
’Assessor’’sParcelNumber’&rAPN.AML
Police&rTRUCKS.AML[date–dow]
Fire&rFIRE.AML
Parks
Facilities&rFAC.AML
Maintenance&rMAINT.AML
Security&rSECURE.AML
Quit
开始调用时,菜单如图11.5所示。
注意在上面文件中,“Tax”和“Parks”有子菜单。
如果选项“Tax”,则弹出子菜单,如图11.6所示。
11.3.3字母键菜单文件
字母键菜单文件的第一行是菜单类型代码为4的标准菜单头。
下列行将指定一个字母键菜单。
4Keymenuforcountyapplication
第二行是一个数字,用来表明用户定义的多少行可视文字或帮助文字跟在第一行后面,帮助文字在你调用菜单或键入‘?
’时将显示在屏幕上。
例如:
CountyDatabase
Makeaselectionbytypingtheindicatedleter
图11.6边条菜单的子菜单
T–Tax
S–Sanitation
P–Police
F–Fire
K–Parks
Q–QuitthismenuandleaveARC/INFO
本例中,有8行可视帮助性文字显示在屏幕上。
如果你未给出正文,系统将为你自动生成帮助表。
菜单文件的余下部分定义字母键菜单有选择键,每个语句由一个代表键盘下字母的字符后接命令组成,下面是一个典型的字母键菜单语句。
S&RTRUCKS.AML[date-dow]
当输入字母键S时,将执行TRUCKS.AML,参数为[date-dow]返回的值。
如果第一个代表按键的部分包含两个以上字母,将产生一个错误;如果一行上单个字符可以解释为一个命令,它必须是本行上唯一的一个字符;如果你为一个字母的大小写分别规定了动作,每个字母将调用不同的动作;如果你仅为某个字母的大写或小写规定了动作,字母的大小写将不加区分,都可调用命令。
下面是一个字母键菜单文件的例子。
4Keymenufileforcountyapplication<8helplines>
8
CountyDatabase
Makeaselectionbytypingtheindicatedletter
T–Tax
S–Sanitation
P–Police
F–Fire
K–Parks
Q–QuitthismenuandleaveARC/INFO
T&menuTAX.MENU[date–dow]
S&rPINMAP.AML[response’EnterDivisionNumber’]
F&rFIRE.AML
P&menuPARKS.MENU&sidebar
Q
上面的菜单文件将显示如下菜单。
CountyDatabase
Makeaselectionbytypingtheindicatedletter
T–Tax
S–Sanitation
P–Police
F–Fire
K–Parks
Q–QuitthismenuandleaveARC/INFO
§11.4格式菜单
格式菜单是一种更为复杂的菜单,格式菜单中可以嵌入几种不同的构件,每种执行一种具体的功能。
有的构件是状态监测器,能够显示当前的信息,比如正在使用什么符号,正在运行什么应用,已经规定了哪些环境和参数;有的构件可用于接受用户输入,例如输入Coverage名字、数据项名字、字符串和数值等等。
在格式菜单中,这些构件有机地组织在一起共同来完成复杂的操作。
下面的菜单(如图11.7所示)给出了可以嵌入在格式菜单中的一些基本构件。
图11.7格式菜单的基本构件
一个格式菜单可以包含输入域、选择域、滚动条和按钮等多种构件。
上面的菜单中包括4种基本构件,它们是:
⑴输入域,用于输入正文。
上例中用来输入Coverage名字。
输入域可以设计为接受特定类型的信息如Coverage名字、系统文件、整数、字符串或X、Y坐标值等。
⑵选择域,用于对一组选项做互斥选择。
例如可用选择域从多种有效的特征类型中选取其中之一。
⑶滚动条,可用来建立一个落在可能值范围内的数值,它很适合于设置参数,如WEED容限值,FUZZY容限值等。
⑷按钮,通过它来执行一个需要的操作。
在上述菜单中,两个按钮放在格式菜单的底部,Apply按钮用来接受指定的设置,Dismiss按钮用来取消相应的操作。
格式菜单如此通用,主要原因在于它的每个构件都有能力对如何操作提供描述性信息或帮助信息,这种帮助可以是一段显示在格式菜单中的正文串或包含可接受选项的一个滚动表,比如,当系统用输入域输入Coverage时,由系统给出的一段出现在表格底部的信息,它描述了输入域要求的合适动作,不用信息的话,也可弹出一个Coverage滚动表。
除了上面介绍的几种构件以外,格式菜单还提供其他几种构件,它们是:
检查框:
检查框通常用来设置一个YES/NO或ON/OFF选项,比如,检查框可以用来确定要绘制哪层的数据库。
显示域:
显示域可以用来表明当前的状态或条件。
显示域不直接由用户操纵,但是与其他构件的交互可以导致显示域的改变。
比如,显示域可以用来显示一个ESRI标志和位于标志下方的ARCPLOT正文串。
设置按钮:
设置按钮可以用来把一个AML变量设置为一个指定的值,设置按钮外观很像按钮。
11.4.1格式菜单如何工作
AML跟踪你与格式菜单构件的交互操作,把由构件指定的值存贮在一个AML变量中,这样从一个滚动表中选择一个Coverage或移动滑轮到值20,相当于把选定的Coverage和20分别赋给与滚动表和滑轮相应的变量。
简而言之,操作一个构件是用图形方式实现&SETVAR指令的一种形式,但是,这种变量赋值不一定在操作一个构件后立即执行,尽管从图形上看很容易产生这种感觉。
当运行一个AML程序时,当每行程序从文件中读出之后,它立即由AML处理器执行。
如果遇到一个&SETVAR指令,一个变量立即设置为一个指定的值。
格式菜单的输入则是将输入暂存在缓冲区中,最后再统一传递给AML处理器处理。
这样,当你与格式菜单构件交互时,你实际上在为一个变量规定一个可能的值。
格式菜单作为用户和AML处理器之间的连接器,保持变量赋值直到控制返回到AML处理器。
有3种方法可以将控制返回到AML处理器,这种控制的返回也称为执行一个格式(菜单)。
1.执行格式来设置变量
执行格式最通常的方法是按下按钮。
按钮是格式菜单的一种构件,它的具体功能是将控制返回给AML处理器。
在格式菜单中按下一个按钮相当于在任何其它类型菜单中选择一个选项。
按下一个按钮则启动AML执行按钮指定的语句。
但在此之前,先要对由格式菜单中其他构件规定的变量进行赋值。
这样,按钮可以引用由其他构件赋值的变量建立由AML处理器处理的命令行,后面还要介绍按钮对于AML语句的执行提供了多种控制功能。
执行格式菜单的第二种方法是通过与检查框、选择、输入或滑动条构件的交互来实现。
与按钮情形相似,返回(RETURN)语句可以与这些构件相连接。
当后接于构件的返回语句在构件操作时会立即传递给处理器处理。
同样,在此之前,要对所有变量赋值先行执行。
例如滑动条可以用来选择多边形的搜索半径,如果返回语句与滑动条相联,移动滑动条可立即根据指定半径执行选择,这样不需要移动滑动条再按下按钮,而只要移动滑动条就可执行想完成的动作。
前面的两个例子中,变量直到从按钮或从另一种构件传送返回语句到AML处理器时才得以设置。
执行格式的最后一种方法是与具体的构件有关的变量在构件操作后立即设置,不需要任何返回语句返回给AML处理器,这种环境用格式参数%FORMOPT建立。
操作构件之后立即设置变量的方法使应用能同时在屏幕上显示几个菜单。
格式菜单不仅能设置变量和传递语句给AML处理器,格式菜单的实用价值在于它能确保具体变量设置为具体值的能力。
例如与滑动条有关的变量可以保持其设置值落在滑动条的数值范围之内;一个输入域可以用来只接受一种具体数据类型的值,如Coverage名字或系统文件名,格式菜单能自动地验证指定的输入是否有效。
11.4.2格式菜单文件
与其他AML菜单一样,格式菜单文件也是一个正文文件,菜单文件的第一行是包含菜单类型代码的标准文件头,格式菜单代码为7,余下部分定义格式设计和操作。
格式菜单也有可视和执行两种成分。
可视成分,称为域引用(fieldreference),代表显示在屏幕上的菜单部分;执行成分称为域定义(fielddefinition),规定了由相应可视成分触发的操作或动作。
但是格式菜单有一点与其他屏幕菜单不同,域引用和域定义语句分别放在文件不同的行中,因为域引用用作构件的位置容器,域引用之间的排列、间距直接对应到菜单中构件的位置和布局。
除了域引用和域定义之外,格式菜单可包含背景正文,背景正文用来说明菜单构件的意图等等。
背景正文可以是一个菜单标题、一个具体的构件描述或其他信息。
格式菜单文件的成分可以用图11.8来说明,图中给出了ARCEDIT中的一个格式菜单的例子,其中给出了它的正文文件和菜单。
图11.8格式菜单文件和格式菜单
菜单上面部分的正文代表菜单中显示部分,由背景正文和域引用组成。
每个域引用前面加‘%’,后接域名,这种表示法用来区分域指针和背景正文。
背景正文可以放在菜单文件中任何位置。
但是,域引用不能从菜单文件中第一列开始,这一列开始,这一列的‘%’号为域定义语句保留。
菜单显示部分的下面是域定义,域定义从菜单文件第一列开始书写,每个域引用都有对应的域定义,它用来定义域类型,因而也决定了该域的操作方式。
域定义可以出现在菜单文件中域引用后任何地方。
为了明了起见,本例中所有域定义均组织在文件尾部。
域定义从域名开始(例如%COVER),域名要对应一个已说明的域引用,域名后接下列关键字之一,即BUTTON,CHECKBOX,CHOICE,DISPLAY,INPUT,SETBUTTON或SLIDER。
在显示菜单时,由域定义取代每个域引用。
每个域定义包括一个指定的选项集,下面对每个域类型作简单描述。
⑴输入域(input)
输入域用于从键盘接受数据,输入域接收的数据类型取决于它的定义。
例如,如果输入域定义为接受Coverage格式菜单自动验证输入数据是否为有效的Coverage名字,如果输入不正确,在表格的底部将发出一条信息说明要求输入的数据类型。
定义一个输入域的语法如下
<%field-name>INPUT{input-options}{type-options}
关键字INPUT定义该域为输入域,关键字后面是AML变量,用来存贮输入到该域中的数据。
此处变量名不要用%括住,因为变量用于赋值而不是引用。
是输入域的宽度,后面可以进一步指定一组输入选项来控制输入域的操作,这些选项包括显示一个滚动选项表的能力,当输入数据无效时取消默认出错信息的能力,设置域初值的能力等等。
输入的类型和相关的类型选项确定了域要接收的数据的种类,可选取的类型包括字符型、整型、实型和一组与AML[GET]函数,如[GETCHOICE]、[GETCOVER]和[GETITEM]等相对应的类型,即CHOICE,COVER和ITEM等类型。
上例中输入域定义如下:
%coverinput.varl25requiredcover
显示如图11.9所示。
图11.9输入域
此例规定了输入域必须填充有效的Coverage名,因为指定域类型为COVER,对应于[GETCOVER]函数。
当按下帮助键时,系统自动弹出Coverage滚动表以供选择。
⑵选择域(choice)
选择域提供了一种设置AML变量的互斥选择工具。
选择域可用来提供一组选项,选项外观上是一组前后相连的水平按钮。
同一时刻只有一个按钮可以按下去,表示同时只有一