菜单界面的实现方法——读GorgonMeducer傻孩子菜单引擎菜单界面的实现方法建议在看下面内容之前复习一下C语言的如下内容1、结构体2、指向函数的指针3、结构体链表4、傻孩子的菜单引擎菜单结构体代码structMenuItem{shortMenuCount;char*DisplayString;void(*Subs)();structMenuItem*ChildrenMenus;structMenuItem*ParentMenus;}Null;shortMenuCountchar*DisplayString;void(*Subs)();structMenuItem*ChildrenMenus;structMenuItem*ParentMenus;structMenuItem菜单界面的实现方法菜单结构体当前层节点数,即每层菜单最多能显示的条目数目的:1、在菜单读取前先读取这个菜单总共拥有的项目数,防止越界。在菜单读取过程中将会有一个计数变量存储菜单移动。所以需要这个变量来确定移动的上界;2、可以方便的实现菜单的滚动。例如:“文件”菜单依次下有:“打开”、“保存”、“打印”、“退出”这4个子项,如果计数存储达到上界“退出”即(MenuCount==4)时再继续向下一级翻页则会回到“打开”。shortMenuCountchar*DisplayString;void(*Subs)();structMenuItem*ChildrenMenus;structMenuItem*ParentMenus;structMenuItem菜单界面的实现方法菜单结构体指向菜单标题字符串的指针目的:指向菜单标题的字符串,指向当选中该级菜单后所要显示的字符串。shortMenuCountchar*DisplayString;void(*Subs)();structMenuItem*ChildrenMenus;structMenuItem*ParentMenus;structMenuItem菜单界面的实现方法菜单结构体指向当前状态应该执行功能函数的指针目的:说明如果选中该级菜单应当执行什么程序,这个指针指向该项所要实现功能的函数。例如:菜单项为“播放”,则该函数指向Play();shortMenuCountchar*DisplayString;void(*Subs)();structMenuItem*ChildrenMenus;structMenuItem*ParentMenus;structMenuItem菜单界面的实现方法菜单结构体指向当前菜单的下级菜单目的:指向结构体指针,用于存储下一级菜单,在后面的链表中详细说明。shortMenuCountchar*DisplayString;void(*Subs)();structMenuItem*ChildrenMenus;structMenuItem*ParentMenus;structMenuItem菜单界面的实现方法菜单结构体指向当前菜单的上级菜单目的:指向结构体指针,用于存储上一级菜单,在后面的链表中详细说明。shortMenuCountchar*DisplayString;void(*Subs)();structMenuItem*ChildrenMenus;structMenuItem*ParentMenus;structMenuItem菜单界面的实现方法菜单结构体菜单界面的实现方法下面以下图所示菜单结构实现为例分析结构体的实际运用:TimeSetVoiceCenterRobotControlFlashOptionTimeSetDataSetAlertSetBackVoiceRecordPlayPauseVoiceDeleteBackTurnLeftTurnRightGoAheadGoBackBackFlashRecordPlayPauseFlashDeleteBack菜单结构体菜单界面的实现方法首先看一下代码示例:voidRobotMenuInit(void){RobotMenu[0].MenuCount=5;RobotMenu[0].DisplayString=TurnLeft;RobotMenu[0].Subs=RobotTurnLeft;RobotMenu[0].ChildrenMenus=&Null;RobotMenu[0].ParentMenus=MainMenu;…}RobotMenu菜单有5个子项菜单结构体菜单界面的实现方法首先看一下代码示例:voidRobotMenuInit(void){RobotMenu[0].MenuCount=5;RobotMenu[0].DisplayString=TurnLeft;RobotMenu[0].Subs=RobotTurnLeft;RobotMenu[0].ChildrenMenus=&Null;RobotMenu[0].ParentMenus=MainMenu;…}RobotMenu菜单的第一个子项(用一个菜单结构体实现的RobotMenu数组)标题为“TurnLeft”菜单结构体菜单界面的实现方法首先看一下代码示例:voidRobotMenuInit(void){RobotMenu[0].MenuCount=5;RobotMenu[0].DisplayString=TurnLeft;RobotMenu[0].Subs=RobotTurnLeft;RobotMenu[0].ChildrenMenus=&Null;RobotMenu[0].ParentMenus=MainMenu;…}RobotMenu菜单一个子项“TurnLeft”实现的功能函数为RobotTurnLeft();用执行函数指针指向这个函数。菜单结构体菜单界面的实现方法首先看一下代码示例:voidRobotMenuInit(void){RobotMenu[0].MenuCount=5;RobotMenu[0].DisplayString=TurnLeft;RobotMenu[0].Subs=RobotTurnLeft;RobotMenu[0].ChildrenMenus=&Null;RobotMenu[0].ParentMenus=MainMenu;…}RobotMenu菜单一个子项“TurnLeft”没有子菜单,所以指向一个空的操作。菜单结构体菜单界面的实现方法首先看一下代码示例:voidRobotMenuInit(void){RobotMenu[0].MenuCount=5;RobotMenu[0].DisplayString=TurnLeft;RobotMenu[0].Subs=RobotTurnLeft;RobotMenu[0].ChildrenMenus=&Null;RobotMenu[0].ParentMenus=MainMenu;…}RobotMenu菜单一个子项“TurnLeft”的上一级菜单为主菜单。菜单结构体菜单界面的实现方法菜单结构体链表MainMenu[0]4“TimeSet”NullSubsTimeMenu&NullMainMenu[1]4VoiceCenterNullSubsVoiceMenu&NullMainMenu[2]4RobotControlNullSubsRobotMenu&NullMainMenu[3]4FlashOptionNullSubsFlashMenu&NullTimeMenu[0]4TimeSetTimeset&NullMainMenuTimeMenu[1]4DataSetDataset&NullMainMenuTimeMenu[2]4AlertSetAlertset&NullMainMenuTimeMenu[3]4BackNullSubs&NullMainMenuVoidDateSet(void);voidMainMenuInit(void);voidTimeMenuInit(void);由MainMenuInit(void)和TimeMenuInit(void)两个函数初始化构造两个菜单数组此时选中主菜单的TimeSet选项,指针指向TimeMenu数组按菜单移动键,选中DataSet选项按下确认键后,无下一级子菜单,执行DataSet();函数