//首先贴出使用到的结构体 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 跳转至页
回复
有奖活动 | |
---|---|
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
【有奖活动】震撼来袭!这场直播将直击工程师的心灵! | |
“我想要一部加热台”活动,不花钱赢取开发好工具!活动开始了哦 | |
【有奖活动】伙伴们:您的“需求”解决了吗? | |
抽奖了,抽奖了,金升阳医疗电源 |
打赏帖 | |
---|---|
【换取手持数字示波器】CH32X035的定时器以及外部中断体验被打赏50分 | |
【换取手持数字示波器】CH32X035搭建开发环境(RISC-V)被打赏50分 | |
【换取手持数字示波器】了解一下自带晶振的实时时钟RX8130被打赏40分 | |
【换取手持数字示波器】PCB布局设计技巧之开关电源被打赏50分 | |
【换取手持数字示波器】带PD协议的MCU(CH32X035)开箱被打赏40分 | |
【换取手持数字示波器】浅谈FSMC控制LCD过程中的注意事项被打赏40分 | |
【换取手持数字示波器】驱动设计——玩转BME280被打赏50分 | |
【学习笔记】RK3568简单helloword程序被打赏50分 | |
搭建STM32H503的Keil开发环境被打赏50分 | |
高云FPGA(GW1NR-LV9)使用串口IP无法通信被打赏20分 |