|
坛子里有很多多级菜单设计的代码,一般都是先创建一个结构体数组,将每个界面编号后,放在结构体数组中。
我觉得可以设计一种更加优雅的方式,提高移植性,于是有了现在的代码(代码很简单,大神勿喷)。
主要思路:
1、每一级菜单称为object, 当级菜单的页面为 item
对应接口:
- bM_OBJ_Handle bM_CreateObject(bM_ITEM_Handle hParent, bM_ID id);
- bM_ITEM_Handle bM_AddItemToObject(bM_OBJ_Handle hobj, bM_ID id, bM_CreateUI_t func);
复制代码
2、下一级菜单一定是基于上一级菜单的某个子页面。这样就可以理解在上面的接口中bM_CreateObject的一个入口参数 hParent就是指定上级菜单的子页面。
3、创建object和item都需要指定用户得id。在添加item到object时可以指定显示界面的功能函数。
4、根据功能的不同,有些情况下需要动态的隐藏和显示某个界面。则可以通过如下接口:
- bM_Result_t bM_ChangeVisibleStatus(bM_ID id, bM_bool_t visible);
复制代码
5、有些项目需要动态更换整个菜单结构,可以提前创建多个菜单结构后,通过下面接口指定当前使用哪一个。
- bM_Result_t bM_SetMenuEntryPoint(bM_OBJ_Handle hobj);
复制代码
例如,创建4级菜单:
item1----item2-----item3-----item4
|
item5----item6----item7
|
item8--item9
|
item10
细化为:
object1 {item1----item2----item3----item4}
object2 {item5----item6----item7}
object3 {item8----item9}
object4 {item10}
准备用户id:
- enum
- {
- USER_ID_OBJECT_1,
- USER_ID_ITEM1,
- USER_ID_ITEM2,
- USER_ID_ITME3,
- USER_ID_ITEM4,
- USER_ID_OBJECT_2,
- USER_ID_ITEM5,
- USER_ID_ITEM6,
- USER_ID_ITEM7,
- USER_ID_OBJECT_3,
- USER_ID_ITEM8,
- USER_ID_ITEM9,
- USER_ID_OBJECT_4,
- USER_ID_ITEM10
- };
复制代码
开始创建菜单结构:
- example_func
- {
- bM_OBJ_Handle hobj, hobj_tmp;
- bM_ITEM_Handle hItem;
-
- hobj = bM_CreateObject(bM_HANDLE_INVALID, USER_ID_OBJECT_1); //一级菜单
- bM_AddItemToObject(hobj, USER_ID_ITEM1, func1);
- hItem = bM_AddItemToObject(hobj, USER_ID_ITEM2, func2);
- bM_AddItemToObject(hobj, USER_ID_ITME3, func3);
- bM_AddItemToObject(hobj, USER_ID_ITEM4, func4);
-
- hobj_tmp = bM_CreateObject(hItem, USER_ID_OBJECT_2); //二级菜单
- bM_AddItemToObject(hobj_tmp, USER_ID_ITEM5, func5);
- hItem = bM_AddItemToObject(hobj_tmp, USER_ID_ITEM6, func6);
- bM_AddItemToObject(hobj_tmp, USER_ID_ITEM7, func7);
-
- hobj_tmp = bM_CreateObject(hItem, USER_ID_OBJECT_3); //三级菜单
- hItem = bM_AddItemToObject(hobj_tmp, USER_ID_ITEM8, func8);
- bM_AddItemToObject(hobj_tmp, USER_ID_ITEM9, func9);
-
- hobj_tmp = bM_CreateObject(hItem, USER_ID_OBJECT_4); //四级菜单
- bM_AddItemToObject(hobj_tmp, USER_ID_ITEM10, func10);
-
- //then set the entry point:
- bM_SetMenuEntryPoint(hobj); //指定当前的菜单结构入口
- }
复制代码
结构创建好后,需要工作起来,则在主循环里调用:
- void bM_BMenuModuleTask(void);
复制代码
需要切换界面时:
- bM_Result_t bM_SendMessage(bM_Operation_t opt, bM_ID id);
复制代码
例如:
- bM_SendMessage(BM_OPERATE_NEXT, 0); // to show the next item
-
- bM_SendMessage(BM_OPERATE_JUMP_TO, USER_ID_ITEM5); //to show the item5
复制代码
当然在开始使用前需要调用初始化函数指定malloc和free接口
- bM_Result_t bM_Init(bM_DMC_Interface_t bM_DMC_Interface);
复制代码
有兴趣的盆友可以使用使用,如果不好用则告诉我,如果好用就留着用吧 !!!
https://github.com/notrynohigh/bMenu
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|