//首先贴出使用到的结构体 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!
关键词: 菜单 GUI
共6条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |