//首先贴出使用到的结构体 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 跳转至页
回复
我要赚赏金打赏帖 |
|
|---|---|
| 基于MCP23S17的输入输出功能模块控制被打赏¥20元 | |
| 【S32K3XX】SPD 软件包使用Link文件修改被打赏¥22元 | |
| Switch-Case局部变量定义问题被打赏¥23元 | |
| 基于米尔TIAM62L开发板的串口通信及应用被打赏¥20元 | |
| PCF8574功能模块及其使用被打赏¥20元 | |
| 传感器LSM6DSO及LIS3MDL的功能检测被打赏¥18元 | |
| LPS25HB气压传感器及其检测被打赏¥18元 | |
| HTS221温湿度传感器及其检测被打赏¥18元 | |
| 【S32K3XX】HSE FW 版本更新被打赏¥21元 | |
| 基于ArduinoUNO开发板的AT24C02读写测试被打赏¥16元 | |
我要赚赏金
