|
最近一直在做菜单程序,发现讨论的以下两个方法比较多
1方法(有不少文章提到此种方式)此处截取部分
typedef struct
{
uchar current;
uchar up; //暂定键值6为up
uchar down;//暂定键值15为down
//uchar enter;
void (*current_operation)();
} key_table;
key_table table[12]=
{
{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[3];
struct MenuItem TimeMenu[4];
struct MenuItem VoiceMenu[5];
struct MenuItem RobotMenu[5];
struct MenuItem FlashMenu[5];
想请教一下马老师两种方式的优缺点,个人觉得第一种方式列表的形式比较直观,但涉及到的每一个状态都要一个函数,有些比较相近的状态切换时有很多重复。
第二种方式上下级的形式很明确,但个人觉得没有第一种方式简洁明了。
不知道大家都用那种方式还是有更好的两全其美的,本人愚钝,向马老师学习 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。
如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》
|