这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 分享一份原创开源的通用型多级菜单设计代码

共8条 1/1 1 跳转至

分享一份原创开源的通用型多级菜单设计代码

高工
2017-12-13 13:57:57     打赏

坛子里有很多多级菜单设计的代码,一般都是先创建一个结构体数组,将每个界面编号后,放在结构体数组中。

我觉得可以设计一种更加优雅的方式,提高移植性,于是有了现在的代码(代码很简单,大神勿喷)。


主要思路:

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);


有兴趣的盆友可以使用使用,如果不好用则告诉我,如果好用就留着用吧 !!!


——回复可见内容——





关键词: 菜单     设计     代码     开源     通用型    

菜鸟
2017-12-30 20:15:38     打赏
2楼

谢谢分享


院士
2017-12-31 09:31:13     打赏
3楼

这个是不是你原创的?

我还是觉得父级、儿子级、兄弟级的分布比较好。


菜鸟
2018-04-09 22:18:28     打赏
4楼

谢谢你


菜鸟
2018-07-04 11:39:24     打赏
5楼

支持一下楼主~~


菜鸟
2019-07-31 15:41:52     打赏
6楼

顶一下


工程师
2019-08-01 23:20:32     打赏
7楼

支持一下


工程师
2019-08-03 23:47:50     打赏
8楼

挺详细的GUI实战!


共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]