搜索
bottom↓
回复: 171

[开源]回报论坛,开源一个自认为目前论坛最好用的菜单架构

  [复制链接]

出0入8汤圆

发表于 2019-9-3 09:18:43 | 显示全部楼层 |阅读模式
本帖最后由 了无 于 2019-9-3 11:49 编辑

        前几天发了一个卖我家自产猕猴桃的帖子,《我家的翠香猕猴桃上市了,需要的坛友看过来》,坛友非常支持,贡献了多一半的销量。
        我激动的无以言表,想送阿莫一箱表示感谢,发过一次短信发过一次站内信,不过站长故意不回复我地址,我也表示理解。怎么回报这个平台呢,想来想去,我决定把我认为最能拿出手的东西贡献出来,这应该也是阿莫最想看到的回报方式。
       
        接下来说一说我这个菜单架构,大家看到后可能觉得眼熟,对,我之前一直想做一个适合自己易用的菜单系统,所以参考了论坛所有菜单相关的帖子,提取其中的优点,加入自己的理解,改造出我认为非常好用的菜单架构,现在发出来,并带上讲解,欢迎大家探讨。
        首先看一下菜单视频,视频地址,这个作品是17年参加立创电子设计大赛的,得了个优秀奖。
        这个菜单系统会根据定义自动构建菜单层级,超时自动退回主界面,菜单值预览等功能。有些朋友要看图,我刚刚录制了一段另外一个项目的。

        然后看一下代码结构,大家就能有一定了解。

  1. 0主界面

  2. 1日期设置 (设置阳历,农历自动计算)
  3. 2时间设置
  4. -----------2.1时间调整
  5. -----------2.2 24小时制
  6. -----------2.3 时间校准 (用于时间隔一段时间自动加减几秒,PS:DS3231的精度够了,完全不用校准)
  7. 3语音设置
  8. -----------3.1 播报模式 (详细模式,简洁模式)
  9. -----------3.2 播报时段 (设置几点到几点开启语音播报)
  10. -----------3.3 音量
  11. 4温度选择 (选择显示的文档来自哪一个传感器,并且在每个传感器里面可以设置各自的补偿)
  12. -----------4.1 DS3231
  13. -----------4.2 DS18B20
  14. -----------4.3 SHT30
  15. 5 显示效果 (目前使用的是渐变切换效果,感觉这个最入眼,什么滚动,百叶窗的个人不喜欢,留个接口后面慢慢加进去吧)
  16. 6亮度设置
  17. ------------6.1 亮度模式 (固定亮度或者自动亮度)
  18. ------------6.2 亮度标定 (设置自动亮度时,最高光线和最暗光线对应的亮度值)
  19. ------------6.3 环境亮度 (获取环境的最高和最暗光线值)
  20. --------------------------6.3.1 自动学习 (24小时自动采集环境的最高和最暗光线值)
  21. --------------------------6.3.2 手动采集 (手动采集环境的最高和最暗光线值)
  22. --------------------------6.3.3 手动设置 (手动指定)
  23. 7 遥控设置
  24. ------------7.1遥控开关 (使用完遥控后可在此关闭遥控的响应,这样用遥控控制原设备的时候就不会影响到时钟了)
  25. ------------7.2 遥控学习
  26. 8 字体设置
  27. ------------8.1 字体选择 (选择时钟字体、菜单字体)
  28. ------------8.2 字体颜色 (选择时钟颜色、菜单颜色)
  29. 9 频谱 (暂时没做,接口留着,后面慢慢加)
  30. -------------9.1颜色设置
  31. -------------9.2 分频设置
  32. -------------9.3 打开频谱
  33. 10 授时设置 (DS3231的精度足够,个人感觉不用浪费买个GPS或者网络模块进行授时,不过接口放在这里,可以在这里设置用什么模块授时,什么时候授时)
  34. 11 闹钟设置 (6组闹钟,可以单独设置周内的星期几响)
  35. -------------11.1闹钟一
  36. -------------11.2闹钟二
  37. -------------11.3闹钟三
  38. -------------11.4闹钟四
  39. -------------11.5闹钟五
  40. -------------11.6闹钟六
  41. 12 屏幕检测 (考虑到LED点阵屏幕会有坏点,所以加了个屏幕检测功能,红-绿-黄-三色循环显示)
  42. 13 还原设置
  43. 14 版本信息
复制代码

这个菜单架构支持多级菜单,三级,四级,五级。。。接下来看一下菜单定义方式。汉字部分是菜单要显示的文字,数字部分表示菜单层级关系。0是主界面 ,1,2,3,4.。。是最顶层菜单,201,202,203是菜单2的下一级菜单,如果要给201时间调整下面再增加一级子菜单,只需要复制一行,把数字这里改成20101就可以了,要删除某一菜单也很简单,如果该菜单是最底层菜单直接删除该行定义就行了,如果有子菜单,可以通过改数字,把下级菜单提到上级。MENU_MODE_QUICKVIEW是我后来加的,意思是显示菜单列表的时候,是否在该行最右边显示菜单内的值,比如
闹钟一。。。。关
闹钟二。。。。开
这样就不用点ok键很快就可以看到总开关了,需要设置具体的值的时候再点ok进去设置。另外这个MenuNode结构体后面得再改造一下,现在的结构没有把常量与状态量分开存放,有些浪费RAM,后期改进。
BrotherNode_First、BrotherNode_End、BrotherNode_Prev。。这几个成员也可以直接在数组中定义好,但是这样一来,一个是得开发人员自己去填,容易填错,另外如果菜单加一个或者删一个,那前后的菜单都要改,所以这里直接都设置成NULL,有菜单内核自己去解析并赋值,目前这样我觉得耦合是最低的。


  1. typedef struct _MenuNode
  2. {
  3.     const unsigned char* Title;
  4.     unsigned long int ID: 26;
  5.     unsigned long int Mode: 1;
  6.     unsigned long int Status: 1;
  7.     unsigned long int CurrentItem: 4;
  8.     char* Message_String;
  9.     struct _MenuNode* BrotherNode_First;
  10.     struct _MenuNode* BrotherNode_End;
  11.     struct _MenuNode* BrotherNode_Prev;
  12.     struct _MenuNode* BrotherNode_Next;
  13.     struct _MenuNode* FatherNode;
  14.     struct _MenuNode* SonNode_First;
  15.     void (*SetPageRun) (void* Para);
  16. } MenuNode;
  17. MenuNode MenuNodes[MENU_NODES_COUNT] =
  18. {
  19.     { (const unsigned char*)"主界面", 0, MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_Main},
  20.     { (const unsigned char*)"日期设置", 1,   MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_Set_Date},
  21.     { (const unsigned char*)"时间设置", 2,   MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU},
  22.     { (const unsigned char*)"时间调整", 201,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_Set_Time},
  23.     { (const unsigned char*)"24小时制", 202,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_Set24Time},
  24.     { (const unsigned char*)"时间校准", 203,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_SetTimeCalibration},
  25.     { (const unsigned char*)"语音设置", 3,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU},
  26.     { (const unsigned char*)"播报模式", 301,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_SetVoiceMode},
  27.     { (const unsigned char*)"播报时间", 302,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_SetVoiceStartEnd},
  28.     { (const unsigned char*)"音量", 303,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_SetVolume},
  29.     { (const unsigned char*)"温度选择", 4,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU},
  30.     { (const unsigned char*)"DS3231", 401,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_Senser_Ds3231},
  31.     { (const unsigned char*)"DS18B20", 402,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_Senser_Ds18b20},
  32.     { (const unsigned char*)"SHT30", 403,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_Senser_Sht30},
  33.     { (const unsigned char*)"显示效果", 5,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU},
  34.     { (const unsigned char*)"时间参数", 501,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_DisplayTimerSet},
  35.     { (const unsigned char*)"页面开关", 502,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_DisplayPageEnable},
  36.     { (const unsigned char*)"版式选择", 503,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_PageSwitch},
  37.     { (const unsigned char*)"亮度设置", 6,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU},
  38.     { (const unsigned char*)"亮度模式", 601,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_SetBrightnessMode},
  39.     { (const unsigned char*)"亮度标定", 602,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_SetBrightnessCelibration},
  40.     { (const unsigned char*)"环境亮度", 603,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU},
  41.     { (const unsigned char*)"自动采集", 60301,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_EnvBightNessLearnAuto},
  42.     { (const unsigned char*)"手动采集", 60302,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_BrightnessLearnManuel},
  43.     { (const unsigned char*)"手动设置", 60303,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_BrightnessLearnSet},
  44.     { (const unsigned char*)"灵敏度", 604,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_SetBrightness_Sensitivity},
  45.     { (const unsigned char*)"遥控设置", 7,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU},
  46.     { (const unsigned char*)"遥控开关", 701,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_SetRemoteKeyEnable},
  47.     { (const unsigned char*)"遥控学习", 702,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_RemoteKeyLearn},
  48.     { (const unsigned char*)"字体设置", 8,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU},
  49.     { (const unsigned char*)"字体选择", 801,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_SetFontType},
  50.     { (const unsigned char*)"字体颜色", 802,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_SetFontColor},
  51.     { (const unsigned char*)"频谱", 9,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU},
  52.     { (const unsigned char*)"颜色设置", 901,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU},
  53.     { (const unsigned char*)"分频设置", 902,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU},
  54.     { (const unsigned char*)"打开频谱", 903,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU},
  55.     { (const unsigned char*)"授时设置", 10,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_GUI_Test},
  56.     { (const unsigned char*)"闹钟设置", 11,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU},
  57.     { (const unsigned char*)"闹钟一", 1101,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_SetAlarmClock},
  58.     { (const unsigned char*)"闹钟二", 1102,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_SetAlarmClock},
  59.     { (const unsigned char*)"闹钟三", 1103,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_SetAlarmClock},
  60.     { (const unsigned char*)"闹钟四", 1104,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_SetAlarmClock},
  61.     { (const unsigned char*)"闹钟五", 1105,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_SetAlarmClock},
  62.     { (const unsigned char*)"闹钟六", 1106,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_SetAlarmClock},
  63.     { (const unsigned char*)"屏幕检测", 12,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_ScreenLed_Check},
  64.     { (const unsigned char*)"还原设置", 13,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_RestoreDefault},
  65.     { (const unsigned char*)"版本信息", 14,  MENU_MODE_QUICKVIEW, MENU_STATUS_NORMAL, MENU_PAGE_ITEM_DEFAULT, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, &Page_VisionInfo},
  66. };
复制代码

说完菜单定义,接下来讲解一下每个菜单项点击OK键后的动作吧,可以看到上面每个菜单项的定义的最右边,关联的是该菜单项进入后的界面,有子菜单的菜单项后面都是NULL,菜单内核会自动显示子菜单列表。下面是声音设置界面,通过MenuRunInfo* MenuRunInfos将当前的键值、菜单位置状态传入页面函数,switch结构切换当前要调整的项。根据键值进入相应的分支,界面有改变后,在下面刷新界面。所有的设置页面可以定义到单独的一个文件中。我在Menu_Page.中定义着。


  1. void Page_SetVolume (MenuRunInfo* MenuRunInfos)
  2. {
  3. #define PAGE_ITEM_VOLUME    1

  4.     if (MenuRunInfos->CursorMenu->Mode  == MENU_MODE_QUICKVIEW)
  5.     {
  6.         return;
  7.     }
  8.     else
  9.     {

  10.     }

  11.     switch (MenuRunInfos->CursorMenu->CurrentItem)
  12.     {
  13.         case MENU_PAGE_ITEM_DEFAULT:
  14.             MenuRunInfos->CursorMenu->CurrentItem = PAGE_ITEM_VOLUME;

  15.             if (MySettings.Volume > 10)
  16.             {
  17.                 MySettings.Volume = 10;
  18.             }

  19.             MenuRunInfos->CursorMenu->Status = MENU_STATUS_HAS_UPATE;
  20.             break;

  21.         case PAGE_ITEM_VOLUME:
  22.             switch (*MenuRunInfos->KeyCode)
  23.             {
  24.                 case BT_KEYCODE_MENU:
  25.                 case BT_KEYCODE_MENU_RMET:
  26.                     MenuRunInfos->flg_CurrentPage = MENU_CURRENT_PAGE_SET_LIST;
  27.                     MenuRunInfos->CursorMenu->CurrentItem = MENU_PAGE_ITEM_DEFAULT;
  28.                     MenuIf_ListShow (MenuRunInfos);

  29.                     return;

  30.                 case BT_KEYCODE_UP:
  31.                 case BT_KEYCODE_UP_RMET:
  32.                     if (MySettings.Volume < 10)
  33.                     {
  34.                         MySettings.Volume++;
  35.                         //FIXME:SLF 2018-05-30 调整音量时播放试听音
  36.                         MenuRunInfos->CursorMenu->Status = MENU_STATUS_HAS_UPATE;
  37.                     }

  38.                     break;

  39.                 case BT_KEYCODE_DOWN:
  40.                 case BT_KEYCODE_DOWN_RMET:
  41.                     if (MySettings.Volume > 0)
  42.                     {
  43.                         MySettings.Volume--;
  44.                         //FIXME:SLF 2018-05-30 调整音量时播放试听音
  45.                         MenuRunInfos->CursorMenu->Status = MENU_STATUS_HAS_UPATE;
  46.                     }

  47.                     break;

  48.                 case BT_KEYCODE_OK:
  49.                 case BT_KEYCODE_OK_RMET:

  50.                     break;

  51.                 default:
  52.                     break;
  53.             }

  54.             break;
  55.     }

  56.     if (MenuRunInfos->CursorMenu->Status == MENU_STATUS_HAS_UPATE)
  57.     {
  58.         Screen_Printf (0, 0, MySettings.FontCfg.FontType_Menu, SCREEN_COLOR_RED, SCREEN_UPDATE_NORMAL, "音量调整");
  59.         Screen_Printf (16, 0, FontsType_DefaultMix, SCREEN_COLOR_RED, SCREEN_UPDATE_NORMAL, "1-10");

  60.         if (MenuRunInfos->CursorMenu->CurrentItem == PAGE_ITEM_VOLUME)
  61.         {
  62.             MenuRunInfos->CursorMenu->Status = MENU_STATUS_NORMAL;
  63.             Screen_Clear (16, 40, 24, 16, SCREEN_COLOR_GREEN, SCREEN_UPDATE_NORMAL);
  64.             Screen_Printf (16, 40, FontsType_DefaultMix, SCREEN_COLOR_GREEN, SCREEN_UPDATE_NORMAL, "%d", MySettings.Volume);

  65.         }

  66.         Screen_UpdateImmediately (SCREEN_COLOR_ALL);
  67.     }

  68. #undef PAGE_ITEM_VOLUME
  69. }
复制代码

然后说一下使用,Menu.c文件是菜单内核文件,不需要修改。使用时先调用Menu_NodesInit (void),初始化各项菜单,并自动建立菜单层级关系。Menu_Loop (void)函数周期调用即可。使用KeyCode全局变量 传入键值。Menu_If.c是接口文件,MenuIf_MenuDispatcher函数不怎么需要改, MenuIf_ListShow (MenuRunInfo* MenuRunInfos)函数需要根据自己的显示屏幕改一下。然后就是定义菜单数组和写每一项菜单的页面函数了。传上我的文件,抛砖引玉,欢迎探讨。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入55汤圆

发表于 2019-9-3 09:30:31 | 显示全部楼层
感谢分享!!要是上些图片就更好了!
一直想弄一个12864的菜单模板。只是水平不够,取取经

出0入0汤圆

发表于 2019-9-3 09:32:46 | 显示全部楼层
感谢分享,支持一下楼主

出0入0汤圆

发表于 2019-9-3 09:34:47 | 显示全部楼层
不错,感谢分享

出0入8汤圆

 楼主| 发表于 2019-9-3 09:36:01 | 显示全部楼层
本帖最后由 了无 于 2019-9-3 09:58 编辑

占楼发些菜单图片
不知道怎么做动态图,先传个静态的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入17汤圆

发表于 2019-9-3 09:37:52 | 显示全部楼层
没想出菜单列表是什么样式,有图片会更好。

支持动态菜单吗? 菜单项会根据参数变化。

出10入12汤圆

发表于 2019-9-3 09:39:42 | 显示全部楼层
好牛 ,学习学习

出0入8汤圆

发表于 2019-9-3 09:41:02 | 显示全部楼层
先占个座,谢谢分享!

出0入8汤圆

 楼主| 发表于 2019-9-3 09:44:19 | 显示全部楼层
wicy001 发表于 2019-9-3 09:37
没想出菜单列表是什么样式,有图片会更好。

支持动态菜单吗? 菜单项会根据参数变化。 ...

可以的,运行时中调整一下 NextNode,PrevNode的指针就可以了

出0入0汤圆

发表于 2019-9-3 09:48:35 | 显示全部楼层
感谢分享

出0入0汤圆

发表于 2019-9-3 09:51:06 | 显示全部楼层
先占楼  吃资源情况如何

出0入0汤圆

发表于 2019-9-3 09:52:20 | 显示全部楼层
看上去不是个简单的菜单结构

出0入0汤圆

发表于 2019-9-3 09:53:49 | 显示全部楼层
感谢楼主的分享

出0入0汤圆

发表于 2019-9-3 09:54:26 | 显示全部楼层
顶一下……

出5入10汤圆

发表于 2019-9-3 10:04:59 | 显示全部楼层
这个看着不错,支持触摸屏吗?

出0入8汤圆

 楼主| 发表于 2019-9-3 10:08:05 | 显示全部楼层
chen849928055 发表于 2019-9-3 10:04
这个看着不错,支持触摸屏吗?

我没试过,不过原理上是可以支持的,可以把触摸触摸坐标先转化成键值,所有的东东,只要映射到菜单按键的键值,就可以操作了

出0入0汤圆

发表于 2019-9-3 10:12:07 | 显示全部楼层
期待已久,代码很整洁,给楼主点赞

出0入0汤圆

发表于 2019-9-3 10:14:29 | 显示全部楼层

每一次变动,都是全屏刷屏吗?

出0入0汤圆

发表于 2019-9-3 10:30:32 | 显示全部楼层
感谢分享

出40入42汤圆

发表于 2019-9-3 10:31:08 | 显示全部楼层
最近开源的帖子变多了,挺好的

出0入9汤圆

发表于 2019-9-3 10:32:55 来自手机 | 显示全部楼层
虽然用不到,但是我要顶一下

出0入17汤圆

发表于 2019-9-3 10:35:55 | 显示全部楼层
了无 发表于 2019-9-3 09:44
可以的,运行时中调整一下 NextNode,PrevNode的指针就可以了

不只是名称的改变, 还有菜单项数量的改变。 比某项菜单有3个子菜单,参数变化后,该项菜单可能变成4或5或6个子菜单,,这种支持吗?

出0入0汤圆

发表于 2019-9-3 10:38:52 | 显示全部楼层
MenuNode MenuNodes[MENU_NODES_COUNT]
感觉这种形式看得好头疼....几十个页面凑一起了。
另外,动图可以LICEcap做。

出0入0汤圆

发表于 2019-9-3 10:52:32 | 显示全部楼层
这个挺好,适合做简单功能设置

出0入0汤圆

发表于 2019-9-3 11:21:17 | 显示全部楼层
借题问下, 商业点阵显示大屏,例如外墙上那种彩色LED电视墙, 是怎么联在一起的?   数据也是类似595串行过去的?  

出0入8汤圆

 楼主| 发表于 2019-9-3 11:21:33 | 显示全部楼层
wicy001 发表于 2019-9-3 10:35
不只是名称的改变, 还有菜单项数量的改变。 比某项菜单有3个子菜单,参数变化后,该项菜单可能变成4或5 ...

可以实现的,有多种方法可以实现,最简单的就是在定义的结构体里面加上使能的结构体

出0入8汤圆

 楼主| 发表于 2019-9-3 11:22:36 | 显示全部楼层
guoj 发表于 2019-9-3 11:21
借题问下, 商业点阵显示大屏,例如外墙上那种彩色LED电视墙, 是怎么联在一起的?   数据也是类似595串行 ...

以前的这种小分辨率的屏用的是595,现在那种全彩高分辨率的,好像用的都是FPGA

出0入0汤圆

发表于 2019-9-3 12:02:28 | 显示全部楼层
这个好,谢谢楼主

出0入0汤圆

发表于 2019-9-3 12:10:48 | 显示全部楼层
最近水贴少了,开源多了,挺好
谢谢楼主

出0入0汤圆

发表于 2019-9-3 12:12:41 | 显示全部楼层
感谢分享

出0入0汤圆

发表于 2019-9-3 12:20:31 来自手机 | 显示全部楼层
支持支持

出0入0汤圆

发表于 2019-9-3 12:40:28 | 显示全部楼层
谢谢分享

出100入0汤圆

发表于 2019-9-3 12:50:13 | 显示全部楼层
非常不错,楼主辛苦了。十几年前我一直想完善产品的那个菜单,因为懒,一直没改進。

我当时是想做成可以自己增加或修改菜单的。

出0入0汤圆

发表于 2019-9-3 12:54:02 | 显示全部楼层
下载学习,谢谢楼主

出0入0汤圆

发表于 2019-9-3 13:02:33 | 显示全部楼层

谢谢分享

出0入0汤圆

发表于 2019-9-3 13:15:19 | 显示全部楼层
支持楼主!

出0入0汤圆

发表于 2019-9-3 13:45:40 | 显示全部楼层
支持键盘输入就更好了

出0入0汤圆

发表于 2019-9-3 14:06:40 | 显示全部楼层
多谢分享

出0入0汤圆

发表于 2019-9-3 14:14:55 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2019-9-3 14:33:17 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2019-9-3 14:43:40 | 显示全部楼层
谢谢分享 看起来不错

出0入0汤圆

发表于 2019-9-3 14:49:54 | 显示全部楼层
谢谢分享

出0入8汤圆

发表于 2019-9-3 14:50:14 | 显示全部楼层
谢谢楼主的分享!!

出5入8汤圆

发表于 2019-9-3 14:55:35 | 显示全部楼层
感谢楼主的分享,学习一下。

出0入0汤圆

发表于 2019-9-3 15:12:02 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2019-9-3 15:14:14 | 显示全部楼层

谢谢楼主分享

出0入0汤圆

发表于 2019-9-3 15:49:44 | 显示全部楼层
^_^,还有这样汇报论坛的,不错,我喜欢。

出0入85汤圆

发表于 2019-9-3 16:04:24 | 显示全部楼层
支持同层菜单多页面显示吗?
是滚动方式还是刷屏方式?

出0入8汤圆

 楼主| 发表于 2019-9-3 16:15:38 | 显示全部楼层
网络孤客 发表于 2019-9-3 16:04
支持同层菜单多页面显示吗?
是滚动方式还是刷屏方式?

支持,
是刷屏方式

出0入0汤圆

发表于 2019-9-3 16:21:32 来自手机 | 显示全部楼层
谢谢楼主分享

出0入0汤圆

发表于 2019-9-3 16:43:25 | 显示全部楼层
很专业的样子,先收藏了,以后估计用得着,感谢分享

另外,还有没有更简单、简洁的菜单这个有点复杂,没法一目了然呀

出0入85汤圆

发表于 2019-9-3 17:00:34 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2019-9-3 17:37:05 来自手机 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2019-9-3 17:44:15 | 显示全部楼层
值得借鉴,谢谢

出0入0汤圆

发表于 2019-9-3 18:10:07 | 显示全部楼层
MAKR下,顶楼主

出5入0汤圆

发表于 2019-9-3 18:52:02 | 显示全部楼层
支持+1                                

出0入0汤圆

发表于 2019-9-3 19:03:18 | 显示全部楼层
感謝樓主分享。

出50入0汤圆

发表于 2019-9-3 23:10:24 来自手机 | 显示全部楼层
感谢分享

出0入0汤圆

发表于 2019-9-3 23:17:33 | 显示全部楼层
核心还是傻孩子那套机制

出0入0汤圆

发表于 2019-9-4 00:07:42 来自手机 | 显示全部楼层
看起来,还是很复杂

出0入0汤圆

发表于 2019-9-4 08:58:45 | 显示全部楼层
美好得一天,从此贴开始

出0入0汤圆

发表于 2019-9-4 09:17:58 | 显示全部楼层
感谢楼主的分享

出0入0汤圆

发表于 2019-9-4 09:44:40 | 显示全部楼层
你好,请问下可以转载吗,会注明作者,谢谢!

出0入0汤圆

发表于 2019-9-4 09:54:41 来自手机 | 显示全部楼层
感谢楼主分享

出0入8汤圆

 楼主| 发表于 2019-9-4 10:35:19 | 显示全部楼层
a22785 发表于 2019-9-4 09:44
你好,请问下可以转载吗,会注明作者,谢谢!

不好意思,仅为坛友福利,而且我里面好的东西没有删。

出0入0汤圆

发表于 2019-9-4 11:05:22 | 显示全部楼层
感谢开源,支持支持!!!!

出0入0汤圆

发表于 2019-9-4 13:14:38 | 显示全部楼层
学习与收藏

出0入0汤圆

发表于 2019-9-4 13:23:46 | 显示全部楼层
先收藏了,谢谢

出0入0汤圆

发表于 2019-9-4 13:32:06 | 显示全部楼层
mark研究过菜单

出0入0汤圆

发表于 2019-9-4 17:00:36 | 显示全部楼层
收藏了,谢谢楼主!

出0入0汤圆

发表于 2019-9-4 17:05:32 来自手机 | 显示全部楼层
感谢楼主的分享

出0入0汤圆

发表于 2019-9-4 17:07:00 | 显示全部楼层
学习与收藏,mark。

出0入0汤圆

发表于 2019-9-4 17:10:37 | 显示全部楼层
之前的用过, 很不错

出0入10汤圆

发表于 2019-9-4 17:16:36 | 显示全部楼层
谢谢楼主的分享   我看了你的代码感觉会很费ram

出0入0汤圆

发表于 2019-9-4 17:24:38 来自手机 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2019-9-5 08:36:53 | 显示全部楼层
了无 发表于 2019-9-3 11:22
以前的这种小分辨率的屏用的是595,现在那种全彩高分辨率的,好像用的都是FPGA ...

谢谢:)

但感觉 用595和FPGA在通讯上,还采用相同的串行通讯协议,则在刷新率等方面不会有太大的差呢,
除非FPGA采用某种高速通讯协议, 否则这种串行的一个一个的级联, 效率低,刷新频率也很难上去.

出0入12汤圆

发表于 2019-9-5 09:34:44 | 显示全部楼层
感谢分享,非常实用

出0入0汤圆

发表于 2019-9-5 09:37:35 | 显示全部楼层
谢谢分享,学习一下。。

出0入0汤圆

发表于 2019-9-5 09:47:15 | 显示全部楼层

感谢楼主的分享

出0入0汤圆

发表于 2019-9-7 11:58:38 | 显示全部楼层
不错的屏幕菜单架构

出0入0汤圆

发表于 2019-9-8 00:53:15 | 显示全部楼层
這架構不錯,有時候只是要文字型菜單,這個就很直觀了。

出0入0汤圆

发表于 2019-9-8 08:46:04 来自手机 | 显示全部楼层
收藏 学习一下

出0入0汤圆

发表于 2019-9-9 10:55:30 | 显示全部楼层
学习学习。。。。。

出0入0汤圆

发表于 2019-9-9 12:28:35 | 显示全部楼层
菜单结构 Mark

出0入0汤圆

发表于 2019-9-9 17:28:31 | 显示全部楼层
楼主强大 感谢分享!先mark了

出0入0汤圆

发表于 2019-9-9 21:23:14 | 显示全部楼层
谢谢分享

出0入36汤圆

发表于 2019-9-9 21:39:54 来自手机 | 显示全部楼层
做一批硬件,在配上你的程序,我们可以再支持一下你哦,哈哈。

出0入0汤圆

发表于 2019-9-9 21:58:49 | 显示全部楼层
已收藏,感谢分享

出0入8汤圆

 楼主| 发表于 2019-9-10 08:34:48 | 显示全部楼层
redworlf007 发表于 2019-9-9 21:39
做一批硬件,在配上你的程序,我们可以再支持一下你哦,哈哈。

嗯嫩,这个想法不错

出0入0汤圆

发表于 2019-9-10 09:04:18 | 显示全部楼层
感谢分享,论坛上优秀的菜单系统层出不穷

出0入0汤圆

发表于 2019-9-10 09:34:44 | 显示全部楼层
追贴去买你家猕猴桃了。

出0入0汤圆

发表于 2019-9-10 10:42:09 | 显示全部楼层
感谢分享

出0入0汤圆

发表于 2019-9-10 11:44:17 | 显示全部楼层
非常感谢楼主的分享

出0入0汤圆

发表于 2019-9-10 12:32:48 | 显示全部楼层
非常不错。学习一下。

出0入0汤圆

发表于 2019-9-10 13:06:50 | 显示全部楼层
感谢分享,看你家猕猴桃口水都流下来。
顺便菜单代码能否整个小工程文件,单个文件看不懂。不好跟踪

出0入8汤圆

 楼主| 发表于 2019-9-10 13:49:46 | 显示全部楼层
myrgb 发表于 2019-9-10 13:06
感谢分享,看你家猕猴桃口水都流下来。
顺便菜单代码能否整个小工程文件,单个文件看不懂。不好跟踪 ...

还没弄小工程,这个是从大工程里面拆出来的。

出0入0汤圆

发表于 2019-9-10 20:42:48 来自手机 | 显示全部楼层
收藏备用,谢谢楼主分享

出0入0汤圆

发表于 2019-9-10 21:23:37 | 显示全部楼层
我第一个菜单程序就类似这样干的,

出0入0汤圆

发表于 2019-9-10 23:07:00 | 显示全部楼层
弱弱的问一声 unsigned long int Mode: 1;中冒号的作用是什么?

出0入0汤圆

发表于 2019-9-10 23:08:06 | 显示全部楼层
是不是表示只取一位?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 13:06

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表