(共257条)改回赵美玲、李志刚、刘建宇(太原理工大学)(山西化工设计院)】介绍一种菜单构成方法,通过菜单独立执行并返回结果,使得主菜单功能可以通过代码和功能分离来实现,成功地克服了主函数必须管理和操作菜单系统的数据以及调度和分析当前任务状态的缺点,并且符合结构原理。 [关键词] 菜单界面、命令、激活键、热键、C语言、结构化设计.nn、命令、、、在许多关于下拉菜单设计的文献中,最广泛使用的方法是使用一系列嵌套的语句构成主功能的基本框架,以及每个选项功能对应的程序段填充在相应的位置。
这样做的缺点是主函数需要管理和操作菜单系统的数据,还要调度和分析当前任务状态,给调试和扩展工作带来麻烦,也不符合分离的结构原则模块功能和数据。 本文介绍了一种用C语言实现的小型应用程序的构造方法,成功地避免了上述问题。 2. 构造方法和操作功能菜单系统的初始化是在程序开始时进行的。 将所需的显示位置、内容、热键等信息用结构体定义并以双向链表链接; 同时自动生成热键和操作命令对比。 表格、菜单、主要功能都可以查询。 所谓操作命令就是在初始化时赋给某个菜单项的一个常量值。 当菜单被激活并且菜单项被选择时,菜单运行函数将该值返回给调用者,然后调用者用分支语句响应该值并切换到不同的例程。 初始化时,可以为此操作指定一个热键,并且会在上面的对照表中添加一个节点来表示热键的命令值和键盘扫描值。 数据结构如图1(a)所示,其中量“able”表示当前是否可以进行操作。 程序运行时,在指定位置显示一个菜单栏,由一级菜单框的标题组成,每个菜单栏都有一个字母,是激活键,要高亮显示。 按 Alt 并 Enter 进行选择,或单击选项来激活密钥。 光标键用于在该组中的选项之间以及菜单框之间进行切换。 当您选择导致下级弹出菜单的选项时,它将打开该菜单。 就可以按照上面的操作了。 按Esc键返回上一级菜单。
当相应命令不可用时,选项显示属性发生改变,此时选择该项将没有任何反应。 菜单框和选项节点的数据结构如图所示。 主菜单框与各组选项之间形成双向循环链表。 这两个全局变量分别指向主菜单和命令表的某个节点。 3、代码实现步骤首先要定义以上三种结构类型。 程序中涉及的键盘扫描值和命令常量一般都是无符号整数。 为了增强程序的可读性,可以将它们替换为宏名称。 另外,为了方便获取扩展键值和shift状态,建议在菜单标题字符串中使用(读取键盘而不是getch)。 您可以使用 '' 字符指定下一个字符作为激活键。 菜单框的激活键与选项的区别在于:初始化时,在菜单框节点的字段中写入Alt,在选项的字段中写入激活键本身对应的扫描码(无符号字符类型)节点; 运行时根据是否按下Alt键来判断。 激活这组选项或跳转到该级别的其他菜单框。 初始化工作分两步进行。 第一步,嵌套调用菜单框构造函数()和选项构造函数()。 链表节点数据结构图(共258个) 菜单界面的C语言实现 1996级菜单构造函数 这里只需修改嵌套步骤就可以轻松改变或扩展菜单系统; 第二步,使用函数将这些节点链接到主菜单。 () 里面包含创建和更新命令表的代码。
调用参数应包括标题字符串指针、显示位置和选项节点指针,并返回构造的节点地址。 根据选项数量调整下拉深度,唯一的作用就是使选项节点的Sub字段包含指向下级菜单的点。 指向框节点的指针并返回选项地址。 此外, 和 都接受可变数量的参数。 由于基于链表的操作需要动态内存分配,因此避免了通过数组定义数据带来的限制。 该函数自动处理保存和恢复屏幕、突出显示、切换、递归调用、检测和分析键盘等,并返回一个命令值给主函数。 为了完整起见,每个操作命令都可以被编程为有效或无效,并且结果将立即反映在菜单的执行中。 为了简单和一致,定义了一个全局变量指针,指向不同显示单元在高亮/正常和有效/无效状态下的显示属性组成的字符串,作为调色板。 4.结束语以此方式构建的菜单驱动模块具有通用性和灵活性的优点。 基础工作包括键值宏定义以及激活键字符到扫描码的转换。 这需要参考DOS用户手册或BIOS相关书籍。 由于篇幅限制,仅给出初始化过程的示例,如图2所示。 附录:调用示例 (10em(″^″,key-F2,Cmd-Rep)em(″^Β″,Key-, ″^File″,(″^Open″,0,Cmd—Open)em(″^ New″,0,Cmd—New)(″^--(box1,box2,功能流程图)