📄 ico_menu.c
字号:
/****************************************************************************************
* 文件名:ICO_MENU.C
* 功能:多层ICO图标菜单操作。
* 作者:黄绍斌
* 日期:2007.05.24
****************************************************************************************/
#include "config.h"
extern uint8 GetAKey(void); // 声明外部函数(按键函数)
extern void Disp_BkPic(void); // 显示背景函数
static MENU_CLASS menu_class[3]; // 用于保存3级菜单句柄地址和所选的子菜单项,menu_class[0]的菜单句柄地址一般固定指向主菜单。
static uint8 menu_class_no; // 当前菜单级别。3级菜单时,值为0--2。
MENUICO g_disp_buf;
/****************************************************************************
* 名称:GUI_MenuIcoDrawA()
* 功能:根据ico(MENUICO类型)的数据显示图标菜单。
* 入口参数:ico 单个图标菜单数据
* sel 为0时表示非选中,为1时表示选中
* 出口参数:无
****************************************************************************/
void GUI_MenuIcoDrawA(MENUICO *ico, uint8 sel)
{ g_disp_buf.x = ico->x;
g_disp_buf.y = ico->y;
g_disp_buf.icodat = ico->icodat;
g_disp_buf.title = ico->title;
g_disp_buf.state = sel;
GUI_MenuIcoDraw(&g_disp_buf);
}
/****************************************************************************
* 名称:GUI_ICOMenuSelect()
* 功能:当前级别的菜单显示及选择菜单
* 入口参数:sel_menu 菜单数据(MY_MENU数组)
* sel_no 默认选中项
* 出口参数:返回选中项的MY_MENU.ret_no返回值
****************************************************************************/
uint8 GUI_ICOMenuSelect(MY_MENU sel_menu[], uint8 sel_no)
{ uint8 key;
uint8 i;
/* 清除上一次的菜单 */
GUI_RectangleFill(142,0, 239,319, WHITE); // **** 要根据图标菜单显示位置修改 ****
/* 显示各菜单项(默认选项要反色显示) */
for(i=0; i<5; i++)
{ if(sel_menu[i].mdata == NULL) break;
if(i == sel_no)
{ GUI_MenuIcoDrawA(sel_menu[i].mdata, 1); // 选中此菜单项
}
else
{ GUI_MenuIcoDrawA(sel_menu[i].mdata, 0);
}
}
/* 进行选择显示操作 */
while(1)
{ key = GetAKey(); // 等待一个按键
/* 分析按键,并进行相应的处理 */
switch(key)
{ case KEY_UP: // 上一菜单项
if(sel_no != 0)
{ GUI_MenuIcoDrawA(sel_menu[sel_no].mdata, 0); // 取得当前菜单项
sel_no--; // 选择下一菜单项
GUI_MenuIcoDrawA(sel_menu[sel_no].mdata, 1); // 反色显示新的选项
}
break;
case KEY_DOWN: // 下一菜单项
if(sel_no < 5)
{ i = sel_no + 1;
if(sel_menu[i].mdata != NULL) // 判断下一个菜单项是否有效
{ GUI_MenuIcoDrawA(sel_menu[sel_no].mdata, 0); // 取得当前菜单项
sel_no++;
GUI_MenuIcoDrawA(sel_menu[sel_no].mdata, 1); // 反色显示新的选项
}
}
break;
case KEY_OK:
return(sel_menu[sel_no].ret_no); // 按OK键,返回所选择菜单的指定返回值
case KEY_ESC:
return(RET_MAINMENU); // 按ESC键,返回第一层菜单
default:
break;
} // end of switch(key)
} // end of while(1)
}
/****************************************************************************
* 名称:GUI_ICOMenuClass3()
* 功能:3级图标菜单选择控制操作函数
* 入口参数:main_menu 菜单模板 (即菜单构造数据)
* 出口参数:无
****************************************************************************/
void GUI_ICOMenuClass3(MY_MENU main_menu[])
{ uint8 menu_sel; // 所选择的菜单返回值
MY_MENU *pmenu; // 菜单句柄指针
/* 参数过滤 */
if(main_menu==NULL) return; // 空菜单结构指针,直接返回
if(main_menu[0].mdata==NULL) return; // 第一个菜单项无效,直接返回
/* 初始化menu_class[0]和menu_class_no变量 */
menu_class[0].menu_addr = main_menu; // 主菜单
menu_class[0].sel_no = 0; // 默认选择菜单项
menu_class_no = 0; // 第一级菜单
Disp_BkPic(); // 显示背景图片
while(1)
{ /* 菜单显示,选择菜单 */
menu_sel = GUI_ICOMenuSelect( menu_class[menu_class_no].menu_addr, // 菜单结构句柄,如MAIN_MENU
menu_class[menu_class_no].sel_no ); // 默认选择菜单项(序号)
/* 对菜单所选值进行处理 */
switch(menu_sel)
{ case RET_MAINMENU: // 直接返回第一层菜单
menu_class_no = 0;
break;
case RET_UPMENU: // 返回上一层菜单
if(menu_class_no==0)
{ return; // 若是在第一层菜单中返回,则退出GUI_ICOMenuClass3
}
else
{ menu_class_no--;
}
break;
case 0: // 常规菜单(0--5)选择,则判断是否要运行程序或进入下一级菜单
case 1:
case 2:
case 3:
case 4:
case 5:
pmenu = menu_class[menu_class_no].menu_addr + menu_sel; // 取得当前选择项的MY_MENU句柄(地址),如"&main_menu[menu_sel]"
if(pmenu->next_menu != NULL) // 若有下一级菜单,则进入下一级菜单
{ if(menu_class_no<2) // 最大为3级菜单
{ menu_class[menu_class_no].sel_no = menu_sel; // 保存当前级所选菜单序号
menu_class_no++; // 下一级菜单
menu_class[menu_class_no].menu_addr = pmenu->next_menu; // 设置下一级菜单菜单结构句柄
menu_class[menu_class_no].sel_no = 0; // 默认选择菜单项(序号)
}
}
else // 执行相应的功能
{ if(pmenu->mdata->Function != NULL)
{ GUI_FillSCR(WHITE); // 清屏
(*pmenu->mdata->Function)(); // 调用菜单项指定的功能函数
menu_class[menu_class_no].sel_no = menu_sel; // 设置新的选择菜单项(序号)
Disp_BkPic(); // 显示背景图片
}
}
default:
break;
} // end of switch(menu_sel)
} // end of while(1)
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -