liuxiaohui17 发表于 2015-1-5 21:52:39

请教马老师菜单程序方法

最近一直在做菜单程序,发现讨论的以下两个方法比较多
1方法(有不少文章提到此种方式)此处截取部分
typedef struct
   {
      uchar current;
      uchar up;//暂定键值6为up
      uchar down;//暂定键值15为down
      //uchar enter;
      void (*current_operation)();
      } key_table;
      
key_tabletable=
{
      {0,11,1,(*fun0)},      // 显示“菜单”
      {1,0,2,(*fun1)},      // 显示“1系统设置”
      {2,1,3,(*fun2)},      // 显示“2控制时间”
    {3,2,4,(*fun3)},      // 显示“3查询温度”
    {4,3,5,(*fun4)},   // 显示“温度×××C”
      {5,4,6,(*fun5)},   // 显示“(时钟)”
      {6,5,7,(*fun6)},   // 显示“设置时钟年”
      {7,6,8,(*fun7)},   // 显示“设置时钟月”
      {8,7,9,(*fun8)},   // 显示“设置时钟日”
      {9,8,10,(*fun9)},    // 显示“设置时钟时”
      {10,9,11,(*fun10)},// 显示“设置时钟分”
      {11,10,0,(*fun11)},// 显示“设置时钟秒”
};

2方法,此处截取部分

/***********************

*   结构体宏定义   *

***********************/

struct MenuItem      

{

    char MenuCount;

    char *DisplayString;

    void (*Subs)();

    struct MenuItem *ChildrenMenus;

    struct MenuItem *ParentMenus;

}NULL_MENU;



void NULL_FUNCTION(void){}



我们看到,菜单的最小单元MenuItem的组成其实非常简单:

菜单项所在层的菜单项数目(度);

菜单项显示出来的字符串;

菜单需要执行的功能的函数指针(可以为空);

孩子指针(表明选择该菜单项后,跳转到哪个子菜单去);

父指针(表明选择ESC后,跳转到哪个菜单去);



看一个菜单实例:

(源代码)



struct MenuItem MainMenu;

struct MenuItem TimeMenu;

struct MenuItem VoiceMenu;

struct MenuItem RobotMenu;

struct MenuItem FlashMenu;
想请教一下马老师两种方式的优缺点,个人觉得第一种方式列表的形式比较直观,但涉及到的每一个状态都要一个函数,有些比较相近的状态切换时有很多重复。
第二种方式上下级的形式很明确,但个人觉得没有第一种方式简洁明了。
不知道大家都用那种方式还是有更好的两全其美的,本人愚钝,向马老师学习

sbk100 发表于 2015-1-6 08:54:30

马老师好像没讲过菜单 希望听听马老的见解

liuxiaohui17 发表于 2015-1-7 12:33:24

对,谁要是有马老师编写的书的清单就好了,一本本看
页: [1]
查看完整版本: 请教马老师菜单程序方法