550 likes | 722 Views
第 9 章 菜单与工具栏设计. 规划与设计在创建菜单系统上起着非常重要的作用,在规划菜单系统的时候,必须确定应用程序的设计目标、对菜单的样式有什么要求、菜单中的哪一部分还需要子菜单以及菜单出现在界面中的什么位置等。 要设计出良好的菜单,必须对菜单系统进行规划,规划时应该注意以下几条原则: 应该按照用户所要执行的任务合理地组织菜单系统。 为每一个菜单和菜单选项设计一个较明确的、有意义的菜单标题和简短提示,便于用户准确领会菜单和菜单选项所对应的操作或功能组成等。. 9.1 规划菜单系统. 9.1.1 菜单系统的规划与设计.
E N D
规划与设计在创建菜单系统上起着非常重要的作用,在规划菜单系统的时候,必须确定应用程序的设计目标、对菜单的样式有什么要求、菜单中的哪一部分还需要子菜单以及菜单出现在界面中的什么位置等。规划与设计在创建菜单系统上起着非常重要的作用,在规划菜单系统的时候,必须确定应用程序的设计目标、对菜单的样式有什么要求、菜单中的哪一部分还需要子菜单以及菜单出现在界面中的什么位置等。 要设计出良好的菜单,必须对菜单系统进行规划,规划时应该注意以下几条原则: 应该按照用户所要执行的任务合理地组织菜单系统。 为每一个菜单和菜单选项设计一个较明确的、有意义的菜单标题和简短提示,便于用户准确领会菜单和菜单选项所对应的操作或功能组成等。 9.1 规划菜单系统 9.1.1 菜单系统的规划与设计
要根据使用频率、逻辑顺序或字母顺序来组织菜单中的菜单选项。如果不能预计菜单选项的频率,也不能确定它们的逻辑顺序,可以考虑使用字母顺序来组织菜单项。在有较多个选项时,按字母顺序特别有效。要根据使用频率、逻辑顺序或字母顺序来组织菜单中的菜单选项。如果不能预计菜单选项的频率,也不能确定它们的逻辑顺序,可以考虑使用字母顺序来组织菜单项。在有较多个选项时,按字母顺序特别有效。 • 对菜单中的菜单选项进行逻辑分组,并用分隔线将各组隔开。进行菜单选项分组时,可以按功能相近的原则进行分组。 • 如果菜单上菜单项的数目超过了一屏,则应为其中的一些菜单项创建子菜单。
描述菜单及菜单选项功能的词汇应尽可能通用。不要使用一些难懂的专业词汇,尽量使用那些简单的、描述明确的、能反映出操作后结果的词汇,也可以使用一些无二义性的短语描述每个菜单或菜单选项。描述菜单及菜单选项功能的词汇应尽可能通用。不要使用一些难懂的专业词汇,尽量使用那些简单的、描述明确的、能反映出操作后结果的词汇,也可以使用一些无二义性的短语描述每个菜单或菜单选项。 • 对于一些常用的菜单或菜单选项,最好设置一些热键和快捷键。使用这些快捷键和热键能快速选择菜单选项。 • 当使用英文来说明菜单和菜单选项的标题或提示时,最好采用大小写混合的方式,使描述明显。
不管应用程序的规模多大,打算使用的菜单有多么复杂,创建菜单系统都需要以下几个步骤:不管应用程序的规模多大,打算使用的菜单有多么复杂,创建菜单系统都需要以下几个步骤: 规划和设计菜单系统。 创建菜单和子菜单。 为菜单系统指定任务。指定菜单所要执行的任务,如显示表单或对话框等。另外,如果需要还可以包含初始化代码和清理代码。 选择【预览】按钮预览整个菜单。 选择菜单中的【生成】命令,生成菜单程序。 运行生成的菜单程序,测试菜单系统。 9.1.2 菜单系统的设计步骤
在Windows系统中,经常会见到各种菜单,最常见的是下拉菜单和快捷菜单。在Windows系统中,经常会见到各种菜单,最常见的是下拉菜单和快捷菜单。 9.2 创建菜单系统 9.2.1 菜单设计器简介 VFP中有很多设计器,如类设计器、数据库设计器、报表设计器等,菜单设计器也是其中之一。使用菜单设计器可以完成用户菜单界面的设计。
1)启动菜单设计器的方法 有如下几种方法可以打开菜单设计器: • 单击常用工具栏中【新建】按钮,在【新建】对话框中的【文件类型】列表中选择【菜单】,然后单击【新建文件】按钮。 • 选择【文件】菜单中的【新建】命令,在【新建】对话框中选择“菜单”,然后单击【新建文件】按钮。 • 从【项目管理器】中选择【其他】选项卡,再选择“菜单”选项,然后单击【新建】按钮。 • 使用命令MODIFY MENU <菜单名>。
无论使用哪种方法,均会出现【新建菜单】对话框,如图(a)所示。在该对话框中,单击【菜单】或【快捷菜单】按钮,都可以打开菜单设计器,分别创建下拉菜单和快捷菜单,如图(b)所示。无论使用哪种方法,均会出现【新建菜单】对话框,如图(a)所示。在该对话框中,单击【菜单】或【快捷菜单】按钮,都可以打开菜单设计器,分别创建下拉菜单和快捷菜单,如图(b)所示。 (a) (b)
2)菜单设计器的组成 (1)【菜单名称】列 在【菜单名称】文本框中输入的文本将作为菜单标题或菜单项的提示字符串显示。 在每个【菜单名称】文本框的左边有一个小方块按钮,它是移动控制命令按钮。当把鼠标移到它上面时指针形状会变成上下双箭头,用鼠标拖动它可改变当前菜单项在菜单列表中的位置。
(2)【结果】列 • 指定在选择菜单标题或菜单项时发生的动作。其中有4个选项: • 子菜单:这是系统默认的选项。它用来构造下级子菜单,新建子菜单时,右侧出现【创建】按钮,单击该按钮,设计器显示新的窗口用以创建下拉菜单。其创建方法与创建主菜单相同。若是修改已经创建的子菜单,则右侧按钮变成【编辑】。 • 命令:如果当前菜单项的功能是执行某种动作,并且该动作只需一条命令完成的话应选择该项。选中该项后,在其右侧出现一文本框,在这个文本框中输入要执行的命令。此选项仅对应于执行一条命令或调用其他程序的情况。如果要执行的动作需要多条命令来完成,而又无相应的程序可用,可选择【过程】选项。 •
过程:如果当前菜单项的功能是执行一组命令,则应选择此项。如果选择了此项,在其右侧将出现【创建】按钮,单击此按钮将调出文本编辑窗口,可以在其中输入过程代码。若要修改过程代码,则右侧按钮将变成【编辑】。过程:如果当前菜单项的功能是执行一组命令,则应选择此项。如果选择了此项,在其右侧将出现【创建】按钮,单击此按钮将调出文本编辑窗口,可以在其中输入过程代码。若要修改过程代码,则右侧按钮将变成【编辑】。 • 填充名称/菜单项:在建立主菜单时是【填充名称】,在建立子菜单时是【菜单项】,其功能是为主菜单项指定一个VFP的内部名称,或为子菜单项指定一个内部编号,以便在程序中引用。
(3)【选项】按钮 单击此按钮将出现如图所示的【提示选项】对话框。在该对话框中可以设置自定义菜单系统中各菜单项的特定选项,如可以定义键盘快捷键、确定启用或废止菜单及菜单项的条件。当选定菜单或菜单项时,在状态栏中还可以设置显示的说明信息。
【快捷方式】选项:用于指定菜单或菜单项的可选快捷键。VFP菜单项的键盘快捷键是Ctrl键和其他键的组合,其中【键标签】文本框显示键组合。【键说明】文本框显示需要出现在菜单项右侧的组合键的提示信息。【快捷方式】选项:用于指定菜单或菜单项的可选快捷键。VFP菜单项的键盘快捷键是Ctrl键和其他键的组合,其中【键标签】文本框显示键组合。【键说明】文本框显示需要出现在菜单项右侧的组合键的提示信息。 • 【位置】选项:包括【容器】和【对象】选项,可以指定当用户在应用程序中编辑一个OLE对象时,菜单标题的位置。 • 【跳过】文本框:该设置属于选择逻辑设计。单击该文本框右边的【…】按钮将显示【表达式生成器】对话框。在表达式生成器的【跳过<expL>】文本框中,输入表达式来确定菜单或菜单项是否可用。在菜单执行时,如果表达式为.T.,菜单或菜单项不可用(呈灰色显示)。 •
【信息】文本框:单击该文本框右边的【…】按钮将显示【表达式生成器】对话框。表达式生成器的【信息<expr>】文本框用于设计菜单或菜单项的说明信息,该说明信息将出现在VFP状态栏中。注意,输入的信息必须加引号。【信息】文本框:单击该文本框右边的【…】按钮将显示【表达式生成器】对话框。表达式生成器的【信息<expr>】文本框用于设计菜单或菜单项的说明信息,该说明信息将出现在VFP状态栏中。注意,输入的信息必须加引号。 • 【主菜单名/菜单项】文本框:当修改主菜单栏时,显示【主菜单名】,当修改子菜单时,显示【菜单项】。其功能是为当前主菜单栏指定一个VFP的内部名称,或为子菜单项指定一个内部编号,以便在程序中引用。 • 【备注】框:为菜单编写一些说明信息,主要在检查和修改时使用。在任何情况下备注都不影响所生成的代码,运行菜单程序时VFP将忽略备注信息。
(4)【菜单级】组合框 显示当前所处的菜单级别。当菜单的层次较多时利用此项可知道当前的位置,并可方便地在主菜单和各级子菜单之间进行切换。 (5)【预览】命令按钮 单击此按钮可以查看所设计的菜单。在所显示的菜单中可以进行选择、检查菜单的层次关系与提示是否正确。这种选择不会执行各菜单的相应动作。
(6)操作菜单项的命令按钮 • 【插入】命令按钮:单击该按钮将在当前选择的菜单项前插入新的一行。 • 【插入栏】命令按钮:单击该按钮将显示【插入系统菜单栏】对话框,如下图所示。在其中可以插入标准的VFP菜单项。 • 【删除】命令按钮:单击该按钮将删除当前菜单项。
9.2.2 预览和运行菜单系统 1)预览菜单系统 在设计菜单系统时,可以预览整个菜单系统,而在生成菜单程序后则可以对系统进行测试和调试。 当菜单设计完毕后,在【菜单设计器】中选择【预览】命令,已经定义的菜单将出现在屏幕的最外层。此外,【预览】对话框可以显示出菜单系统的文件名(或临时文件的文件名)。 如果选定一个菜单标题或菜单项,则会在【预览】对话框中显示它,并显示为菜单或菜单项所指定的命令。
2)运行菜单程序 可以通过菜单方式和命令方式来运行菜单程序: (1)菜单方式 选择【程序】菜单中的【运行】命令,打开【运行】对话框,双击菜单程序(扩展名为.mpr)即可。 (2)命令方式 在命令窗口中输入命令: do <菜单程序文件名>.mpr 其中,<菜单程序文件名>是要运行的菜单,扩展名.mpr不能缺省。
1)利用【快速菜单】创建下拉菜单 当新建一个下拉菜单时,系统在打开菜单设计器的同时,将会在VFP系统菜单上增加一个【菜单】选项,如果希望以VFP的系统菜单为模板建立新菜单,则可以选择该菜单中的【快速菜单】命令,出现如下图所示的菜单。该菜单与VFP 6.0中文版的主菜单完全一致,这种方法可以快速生成一个高质量的菜单系统,然后根据自己的需要进行修改。 9.2.3 创建下拉菜单
注意:快速菜单只能对空的菜单设计器有效,如果在菜单设计器中已经输入了内容,则【快速菜单】项将变成灰色而不可用。注意:快速菜单只能对空的菜单设计器有效,如果在菜单设计器中已经输入了内容,则【快速菜单】项将变成灰色而不可用。
【例9.1】利用【快速菜单】建立一个只包含“文件”、“编辑”和“显示”3项的菜单,以文件名mymenu1保存并生成菜单程序。【例9.1】利用【快速菜单】建立一个只包含“文件”、“编辑”和“显示”3项的菜单,以文件名mymenu1保存并生成菜单程序。 操作步骤如下: ①打开菜单设计器窗口。 ②选择【菜单】中的【快速菜单】,生成如上图所示的新菜单。 ③用鼠标左键选中不需要的菜单栏,然后单击设计器右边的【删除】按钮,将其删除,在这里只能逐栏删除。
④预览菜单:单击设计器右边的【预览】按钮,则VFP窗口的系统菜单会消失,出现的是新菜单,如下图所示。注意,该步骤不是必须的,但是通过预览可以查看菜单系统的外观,便于及时修改。
⑤保存菜单:单击工具栏上的【保存】按钮,在弹出的【另存为】对话框中,输入菜单名“mymenu1”,单击【保存】按钮,将新菜单保存为mymenu1.mnx。 ⑥生成菜单程序:选择【菜单】中的【生成】命令,将弹出如下图所示的【生成菜单】对话框。单击【生成】按钮,将生成“mymenu1.mpr”菜单程序。 ⑦运行菜单程序mymenu1.mpr。在VFP窗口中就会显示所定义的菜单。要恢复系统菜单,应在命令窗口中输入以下命令: set sysmenu to default
2)利用菜单设计器创建用户自定义的下拉菜单 【例9.2】建立一学籍管理系统菜单的下拉菜单,如下图所示,其中“档案浏览”能浏览“学生档案表.dbf”数据表的学生信息,并能通过【关闭】选项关闭数据表,【退出】将恢复系统菜单。以文件名“xjgl”保存并生成菜单程序。
操作步骤如下: ①合理规划设计该菜单; ②在命令窗口中输入命令:MODIFY MENU xjgl,打开【菜单设计器】; ③在菜单名称中依次输入主菜单标题“学籍管理”、“系统维护”、“退出”,如下图所示。
④在上图中,选择【结果】列中的【子菜单】选项,单击“学籍管理”菜单之后的【编辑】按钮,为“学籍管理”建立子菜单,如下图所示,依次输入子菜单项后,在【关闭】一栏中的【结果】列中选择【命令】,在后面的文本框中输入命令:close all。
在“档案浏览”一栏中的【结果】列中选择【过程】,单击【创建】按钮,在如下图所示的代码编辑窗口中输入代码。在“档案浏览”一栏中的【结果】列中选择【过程】,单击【创建】按钮,在如下图所示的代码编辑窗口中输入代码。 ⑤在【退出】菜单的【结果】列中选择【过程】,单击【编辑】按钮后, 在过程编辑窗口中输入代码,例如: modify window screen && 恢复VFP主窗口的标题 set sysmenu to default && 恢复VFP系统菜单 activate window command && 恢复命令窗口 输入完毕,关闭该窗口。
⑥同样还可以继续输入其他内容,保存该文件为xjgl.mnx。⑥同样还可以继续输入其他内容,保存该文件为xjgl.mnx。 ⑦预览该菜单。 ⑧从【菜单】菜单中选择【生成】命令,生成菜单程序xjgl.mpr。 ⑨运行该菜单程序xjgl.mpr。
9.2.4 创建快捷菜单 【例9.3】设计一快捷菜单mymenu2,包括“剪切”、“复制”、“粘贴”和“清除”选项,供在系统登录表单中输入密码的文本框使用。 操作步骤如下: ①选择【文件】菜单中的【新建】命令,在【新建】对话框中选择“菜单”,单击【新建文件】按钮进入【新建菜单】对话框,单击【快捷菜单】按钮进入快捷菜单设计器,如下图所示。
②在快捷菜单生成器中,单击【插入栏】按钮,进入【插入系统菜单栏】对话框。②在快捷菜单生成器中,单击【插入栏】按钮,进入【插入系统菜单栏】对话框。 ③从【插入系统菜单栏】中选择“剪切”、“复制”、“粘贴”和“清除”菜单项。
④保存该菜单文件为mymenu2.mnx,并生成菜单程序mymenu2.mpr。④保存该菜单文件为mymenu2.mnx,并生成菜单程序mymenu2.mpr。 ⑤把设计的快捷菜单添加到需要的表单中。打开表单设计器,设计系统登录界面的表单,双击“输入密码”的文本框的RightClick Event属性,打开RightClick过程代码编辑窗口,在其中输入:DO mymenu2.mpr。保存表单,并运行这个表单,右击表单中的文本框控件即可弹出快捷菜单,如下图所示。
一般情况下,生成的菜单会出现在VFP的界面上,如果希望设计好的菜单出现在自己设计的表单界面上,则必须设置菜单的顶层表单(SDI)属性。同时,在表单中也必须进行相应设置,以调出菜单系统。一般情况下,生成的菜单会出现在VFP的界面上,如果希望设计好的菜单出现在自己设计的表单界面上,则必须设置菜单的顶层表单(SDI)属性。同时,在表单中也必须进行相应设置,以调出菜单系统。 9.2.5 在顶层表单中设计菜单 【例9.4】在学生档案浏览表单中增加菜单memenu3,实现按学号、姓名、出生日期以及专业班级为序的浏览,如下图所示。假设已经对dab.dbf按学号、姓名、出生日期和专业班级建立结构化复合索引,索引标识分别为“学号”、“姓名”、“出生日期”和“专业班级”。
操作步骤如下: ①创建菜单。打开【菜单设计器】,从【显示】菜单中选择【常规】选项,并选择【顶层表单】选项。其余步骤与例9.2完全一样。其中【关闭】的结果为过程,代码为: _VFP.activeform.release &&_VFP.activeform为引用当前菜单所在的表单 close all &&关闭所有文件 “排序”子菜单的各菜单结果均为过程,其过程代码分别如下图所示。然后生成菜单程序mymenu3.mpr。
②创建顶层表单“sdi1.scx”。打开【表单设计器】设计表单,在表单的【数据环境】中添加学生档案表dab.dbf,将该表拖动到表单设计器中,并将该表单的ShowWindow属性设置为2-作为顶层表单。编写表单的Init事件代码:②创建顶层表单“sdi1.scx”。打开【表单设计器】设计表单,在表单的【数据环境】中添加学生档案表dab.dbf,将该表拖动到表单设计器中,并将该表单的ShowWindow属性设置为2-作为顶层表单。编写表单的Init事件代码: DO mymenu3.mpr with this, .T. 保存并运行表单sdi1.scx
9.3 设置菜单属性 1)分组菜单项 在定义子菜单的各菜单项时,常常将相关功能的菜单项分成一组,使菜单的界面更加清晰。例如,在VFP的【文件】菜单中,【关闭】和【保存】命令之间有一条直线,这条直线就是分隔线,它可以将不同的组分隔开。 将菜单项分组的方法是:打开【菜单设计器】窗口,在需要放置分隔线的位置用【插入】按钮插入一个新的菜单项,在菜单名称中输入“\\-”,便可创建一条分隔线。
2)指定快速访问键 一个好的菜单系统,各菜单项都具有快速访问键,可以实现通过键盘快速访问菜单的功能。在主菜单标题和子菜单项中,通常都带有访问键,访问键用带有下划线的字母表示。 可以在自己所设计的菜单系统中加入快速访问键,如下图所示。
方法是在每个菜单名称项后加上“(\<访问键的字母)”,如下图所示的每个菜单项都有快速访问键。方法是在每个菜单名称项后加上“(\<访问键的字母)”,如下图所示的每个菜单项都有快速访问键。
3)指定键盘快捷键 除了指定键盘快速访问键以外,还可以为菜单或菜单项指定键盘快捷键。 VFP菜单项的快捷键一般采用Ctrl与另一个键组合的形式。 按以下步骤可以为菜单或菜单项指定快捷键: ①在【菜单名称】栏中,选择相应的菜单标题或菜单项。
②单击【选项】栏中的按钮,弹出【提示选项】对话框,如下图所示。②单击【选项】栏中的按钮,弹出【提示选项】对话框,如下图所示。
③在【键标签】框中,按下一组合键如Ctrl+R,可创建快捷键。如果一个菜单项没有快捷键,系统将在【键标签】框中显示“按下要定义的键”。 ④在【键说明】框中,添加希望在菜单项的旁边出现的文本。在默认情况下,在【键说明】框中重复【键标签】框的快捷键标记。不过,如果希望在应用程序中显示其他内容,也可以更改【键说明】框中的文本。 设置好快捷键后,就可以直接按下快捷键来执行相应菜单项的功能,而不必通过菜单来选取。
9.4 用类设计器创建自定义工具栏 如果经常在应用程序中重复执行某些任务,就可以把这些任务做成对应的工具按钮,添加到自定义工具栏,既可简化操作,又可加速任务的执行。 自定义工具栏实际上是一种用户自定义类,由于自定义工具栏本身是一种表单,因此其定义必须在表单集中创建。
创建自定义工具栏可以按以下3个步骤来进行:创建自定义工具栏可以按以下3个步骤来进行: ①从Toolbar基类创建一个自定义工具栏类,并为其设置功能。 ②在表单控件工具栏中添加一个代表该自定义工具栏的按钮。 ③在表单集中创建该工具栏。 【例9.5】设计一个能够移动指针的工具栏movetool,要求包括“第一条记录”、“上一条记录”、“下一条记录”、“最后一条记录”和“关闭”等5个按钮。
操作过程如下: 首先,创建一个自定义工具栏类。 ①从Toolbar基类创建新类:选择【文件】菜单中的【新建】命令,在【新建】对话框中选定【类】选项按钮,再单击【新建文件】按钮,弹出【新建类】对话框,如下图所示。在【新建类】对话框的【类名】文本框中输入“movetool”,在【派生类】下拉列表框中选择“Toolbar”选项,在【存储于】文本框中输入“myclass”,确定后出现【类设计器】窗口。
②在“movetool”工具栏对象中建立“第一条记录、上一条记录、下一条记录、最后一条记录和关闭”5个按钮,如下图所示,并分别设置这5个按钮的属性如下:
③为“movetool”工具栏对象建立一个名为state(状态)的新方法程序,用以控制按钮是否可选。选择【类】菜单的【新建方法程序】命令,在打开的【新建方法程序】对话框输入新方法的名称state,单击【添加】按钮,然后单击【关闭】按钮。③为“movetool”工具栏对象建立一个名为state(状态)的新方法程序,用以控制按钮是否可选。选择【类】菜单的【新建方法程序】命令,在打开的【新建方法程序】对话框输入新方法的名称state,单击【添加】按钮,然后单击【关闭】按钮。 ④为“movetool”工具栏对象的state方法程序编写代码,使各按钮在不同状态下可用或不可用。在“movetool”工具栏的属性窗口中找到“state”方法属性,双击打开过程代码编辑窗口,输入代码,如上图所示。
⑤“movetool”工具栏的Activate事件的代码编写如下: *初始时各按钮都可用 This.Com1.Enabled=.T. This.Com2.Enabled=.T. This.Com3.Enabled=.T. This.Com4.Enabled=.T. This.Com5.Enabled=.T. ⑥“第一条记录”按钮的Click事件代码编写如下: *This表示本工具栏,This.Parent表示包含本工具栏的表单集 go top This.Parent.state(1) &&将1传入state方法程序,由ps接收,使上一条记录按钮不可用
⑦“上一条记录”按钮的Click事件代码编写如下:⑦“上一条记录”按钮的Click事件代码编写如下: if bof() &&是文件开始 This.Parent.state(1) &&使上一条记录按钮不可用 else skip –1 if bof() This.Parent.state(1) else This.Parent.state(3) &&使各按钮都可用 endif endif
⑧“下一条记录”按钮的Click事件代码编写如下:⑧“下一条记录”按钮的Click事件代码编写如下: if eof() &&是文件结束 This.Parent.state(2) &&使下一条记录按钮不可用 else skip if eof() This.Parent.state(2) else This.Parent.state(3) endif endif