//首先贴出使用到的结构体 menu.h
#ifndef _MENU_H
#define _MENU_H
//菜单索引ID
typedef enum {
id_main,
id_set,
id_test,
id_set_date,
id_total,
id_invoid = 0xff,
}MENU_E;
//菜单子项结构体
typedef struct MenuItem
{
char *displayStr;
MENU_E childrenMenuId;
}MenuItem_T;
//一个菜单页结构体
typedef struct MenuFrame
{
MENU_E ownMenuId;
int maxIndex;
MENU_E parentMenuId;
MenuItem_T* pMenuItems;
}MenuFrame_T;
//菜单控制结构体
typedef struct MenuContorl
{
short currtIndex;
MenuFrame_T* pCurrtMenu;
void (*handle)(struct MenuContorl* currt);
}MenuContorl_T;
#endif
//下面是具体的测试使用部分 menu.c
#define ITERMS_LENGHT(a) {sizeof(a)/sizeof(a[0])}
MenuItem_T setDateMenusItem[] = {
{"set year",id_invoid},
{"set mon",id_invoid},
{"set day", id_invoid},
{"set hour", id_invoid},
{"set min", id_invoid},
{"set sec", id_invoid},
};
MenuItem_T setMenusItem[] = {
{"set1", id_invoid },
{"set2", id_set_date }
};
MenuItem_T mainMenuItem[] = {
{"SET", id_set },
{"TEST", id_test },
{"EXE", id_invoid }
};
MenuItem_T testMenusItem[] = {
{"test1", id_invoid},
{"test2", id_invoid}
};
void menuHandle(MenuContorl_T* currt)
{
printf("menuHandle: menu id:%d item:%d\n",currt->pCurrtMenu->ownMenuId,currt->currtIndex);
}
MenuFrame_T sysMenu[id_total] = {
{id_main,ITERMS_LENGHT(mainMenuItem), id_invoid, mainMenuItem },
{id_set,ITERMS_LENGHT(setMenusItem), id_main, setMenusItem },
{id_test,ITERMS_LENGHT(testMenusItem), id_main, testMenusItem },
{id_set_date,ITERMS_LENGHT(setDateMenusItem),id_set, setDateMenusItem }
};
MenuContorl_T menuControl = {
0,
sysMenu,
menuHandle
};
void menu_Frame_init(MenuContorl_T* pMenu)
{
int i;
int len = pMenu->pCurrtMenu->maxIndex;
printf("***********menu********** \n");
for(i=0;i<len;i++)
{
printf("%d.%s\n",i+1,pMenu->pCurrtMenu->pMenuItems[i].displayStr);
}
pMenu->currtIndex = 0;
}
//测试部分,我这边是使用串口接收字符控制
if(ch == '+') //菜单下移
{
if(menuControl.currtIndex < menuControl.pCurrtMenu->maxIndex)
menuControl.currtIndex++;
if(menuControl.currtIndex == menuControl.pCurrtMenu->maxIndex)
menuControl.currtIndex = 0;
printf("***currt:%s***\n",menuControl.pCurrtMenu->pMenuItems[menuControl.currtIndex].displayStr);
}
else if (ch == '>') //菜单进入子项
{
if(id_invoid != menuControl.pCurrtMenu->pMenuItems[menuControl.currtIndex].childrenMenuId)
{
menuControl.pCurrtMenu = &sysMenu[menuControl.pCurrtMenu->pMenuItems[menuControl.currtIndex].childrenMenuId];
menu_Frame_init(&menuControl);
}
}
else if (ch == '<') //菜单返回上一级
{
if(id_invoid != menuControl.pCurrtMenu->parentMenuId)
{
menuControl.pCurrtMenu = &sysMenu[menuControl.pCurrtMenu->parentMenuId];
menu_Frame_init(&menuControl);
}
}
else if (ch == '=') //菜单对应项处理函数
{
menuControl.handle(&menuControl);
}
共6条
1/1 1 跳转至页
转帖: 分享一个自己写的菜单架构测试小程序,GOOD!

百度 第二十二条违反本办法的规定,未在其网站主页上标明其经营许可证编号或者备案编号的,由省、自治区、直辖市电信管理机构责令改正,处5000元以上5万元以下的罚款。
关键词: 菜单 GUI
共6条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 | |
汽车电子中巡航控制系统的使用被打赏10分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏100分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 |