最近看论坛里的菜单实现方法,发现有两种讨论的比较多,如下(1方法我不清楚出处,在此注明;2方法就是你写的菜单那种)
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方法(详见http://www.amobbs.com/thread-591361-1-1.html)此处截取部分
/***********************
* 结构体宏定义 *
***********************/
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];
想请教一下两种方式的优缺点,谢谢 |