OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 16265|回复: 36

LCD多级菜单,欢迎大家一起来讨论。。。

[复制链接]

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2016-1-28 14:28:59 | 显示全部楼层 |阅读模式
最近在做一个多级菜单项目,看了很多资料,大体分两种设计思路:1、通过双向链表实现;2、通过数组实现。思路无非是把菜单联系起来,可以跳到下级菜单,也可以返回上级菜单。用傻孩子的双向链表的方法,大体上实现了。但是有些细节没有想明白,感觉代码写的一团糟。现在发帖,和大家一起谈论下。
傻孩子给的历程,一会我以附件的形式给出。

/***********************
* 结构体宏定义 *
***********************/
struct MenuItem
{
char MenuCount;                         //本级菜单项目数
char *DisplayString;                      //本菜单显示字符串
void (*Subs)();                           //本菜单对应的功能函数,可以为NULL
struct MenuItem *ChildrenMenus;   //下级菜单指针,可以为NULL
struct MenuItem *ParentMenus;    //上级菜单指针,可以为NULL
}NULL_MENU;

问题1:
char *DisplayString 这个变量有必要吗?
只给显示函数函数要显示的内容,不给坐标,有什么用?

问题2:
按着下面给出的历程,每个按键的功能,在每个界面都是一样的,如果不同的界面,按键含义不同,怎处理?

问题3:
void (*Subs)()指向的函数,只有当按下Enter键时候才执行,也就是说void (*Subs)()指向的函数一旦返回,就不能再进入。这样就有问题,当用户要输入参数时候,加入没有输入完,函数是不能返回的,这个时候就会阻塞main函数,怎么解决?


int main()
{                     
    short KeyNum = 0xff;
    SystemInitialation();            //系统初始化
    ShowMenu();
        while(1)
        {
            ClearWatchDog();             //喂狗
            KeyNum = GetKeyNum();        //获取按键值
            /*******************目录操作*********************/
            /***************************************
            *   [按键说明]                         *
            *  ----------------------------------- *
            *   [K1]            UP(向上)           *

            *   [K5]            Down(向下)         *

            *   [K2]            Esc(后退)          *

            *   [K6]            Enter(确定)        *

            *   [K3]            返回根目录         *
            ***************************************/
            if (KeyNum != 0xff)
            {
             ShowMenu();
                 switch(KeyNum)
                 {
                     case UP:
                         UserChoose --;
                         if (UserChoose < 0)
                         {
                             UserChoose = MaxItems-1;
                         }
                         break;
                     case Esc:
                         if (MenuPoint[0].ParentMenus != &Null)
                         {
                             MenuPoint = MenuPoint[0].ParentMenus;
                             UserChoose = 0;
                             DisplayStart = 0;
                         }
                         break;
                     case Down:
                         UserChoose ++;
                         if (UserChoose == MaxItems)
                         {
                             UserChoose = 0;
                         }
                         break;
                     case Enter:
                         if (MenuPoint[UserChoose].Subs != NullSubs)
                         {
                             (*MenuPoint[UserChoose].Subs)();
                         }
                         else if (MenuPoint[UserChoose].ChildrenMenus != &Null)
                         {
                             MenuPoint = MenuPoint[UserChoose].ChildrenMenus;
                             UserChoose = 0;
                             DisplayStart = 0;
                         }
                         break;
                     case Reset:
                         MenuPoint = MainMenu;
                         UserChoose = 0;
                         DisplayStart = 0;
                         break;
                 }
                 if ((UserChoose < DisplayStart) || (UserChoose > (DisplayStart+3)))
                 {
                    DisplayStart = UserChoose;
                 }
                 ShowMenu();
            }
            /*******************目录操作*********************/
        }
}








傻孩子菜单历程.rar

3.42 KB, 下载次数: 1457

30年众生牛马,60年诸佛龙象!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

180

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2015-6-29
在线时间
101 小时
发表于 2016-1-28 20:30:10 | 显示全部楼层
ST官方有一个软件包STM32F10x_AN2790_FW_V2.0.0,里面有一个简单的菜单结构,最近我自己做的一个菜单就是按照里面的菜单结构的思路扩充的,可以参考一下


menu.zip

9.52 KB, 下载次数: 1734

我是菜鸟
回复 支持 1 反对 0

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
 楼主| 发表于 2016-1-28 16:02:07 | 显示全部楼层
怎么没有人呢?
30年众生牛马,60年诸佛龙象!
回复 支持 反对

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2016-1-28 18:28:50 | 显示全部楼层
目前用二维数组来做多级菜单,效果还可以,虽然没有链表做菜单强,但胜在节省了很多SRAM,在SRAM资源充足的情况下还是建议用链表不要用数组
拿来长岛冰茶换我半晚安睡
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2015-11-24
在线时间
5 小时
发表于 2016-1-28 22:28:29 来自手机 | 显示全部楼层
本帖最后由 没有对象的程序员 于 2016-1-28 22:40 编辑

NULL_MENU *p_menu;假设有三个菜单menu1,menu2,menu3
然后具体按键中判断
if (p_menu == &menu1)
else if (p_menu == &menu2)
……
手机不好打字,只好打个大概不知楼主看懂没
主要就是比较当前指针与哪个菜单的地址匹配
回复 支持 反对

使用道具 举报

5

主题

163

帖子

0

精华

高级会员

Rank: 4

积分
615
金钱
615
注册时间
2011-11-7
在线时间
180 小时
发表于 2016-1-28 23:10:20 | 显示全部楼层
就是状态机,不是太复杂用switch也不错的
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2016-1-28 23:16:34 来自手机 | 显示全部楼层
switch+goto就够了,简单
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1367
金钱
1367
注册时间
2014-2-13
在线时间
169 小时
发表于 2016-1-29 08:18:39 | 显示全部楼层
问题1、2:这个菜单结构只能实现简单的界面变化,也就是说每个界面的标题位置是固定的。例如:手抄器、手持控制器等界面比较简单
问题3:我觉得不会
回复 支持 反对

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
 楼主| 发表于 2016-1-29 09:07:42 | 显示全部楼层
负西弱 发表于 2016-1-28 20:30
ST官方有一个软件包STM32F10x_AN2790_FW_V2.0.0,里面有一个简单的菜单结构,最近我自己做的一个菜单就是 ...

谢谢,我参考下,我有不明的地方,还望您多多指教。
30年众生牛马,60年诸佛龙象!
回复 支持 反对

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
 楼主| 发表于 2016-1-29 09:12:25 | 显示全部楼层
solo 发表于 2016-1-29 08:18
问题1、2:这个菜单结构只能实现简单的界面变化,也就是说每个界面的标题位置是固定的。例如:手抄器、手持 ...

问题3为什么不会呢?
30年众生牛马,60年诸佛龙象!
回复 支持 反对

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
 楼主| 发表于 2016-1-29 09:13:23 | 显示全部楼层
夜猫煮茶 发表于 2016-1-28 23:10
就是状态机,不是太复杂用switch也不错的

几个界面可以用switch,界面多了,代码就有点乱,也不利于修改。
30年众生牛马,60年诸佛龙象!
回复 支持 反对

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
 楼主| 发表于 2016-1-29 09:14:28 | 显示全部楼层
wangyan915205 发表于 2016-1-28 23:16
switch+goto就够了,简单

那还不如用我现在的函数指针的方法,条例还清晰,也便于修改和维护。
30年众生牛马,60年诸佛龙象!
回复 支持 反对

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
 楼主| 发表于 2016-1-29 09:15:38 | 显示全部楼层
没有对象的程序员 发表于 2016-1-28 22:28
NULL_MENU *p_menu;假设有三个菜单menu1,menu2,menu3
然后具体按键中判断
if (p_menu == &menu1)

大体上明白,就是现判断目前的界面处于那个界面,然后去执行本界面相关的函数或者操作。
30年众生牛马,60年诸佛龙象!
回复 支持 反对

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
 楼主| 发表于 2016-1-29 09:16:44 | 显示全部楼层
FreeRTOS 发表于 2016-1-28 18:28
目前用二维数组来做多级菜单,效果还可以,虽然没有链表做菜单强,但胜在节省了很多SRAM,在SRAM资源充足的 ...

为什么费SRAM呢?前面加const不就完了,所有的结构体都在ROM里。
30年众生牛马,60年诸佛龙象!
回复 支持 反对

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2016-1-29 10:52:56 | 显示全部楼层
本帖最后由 FreeRTOS 于 2016-1-29 10:55 编辑
无痕幽雨 发表于 2016-1-29 09:16
为什么费SRAM呢?前面加const不就完了,所有的结构体都在ROM里。

结构体加const???恕我C语言基础薄弱,如果加了const还能修改里面的内容么?
比如菜单当前索引号占据了1个字节,函数指针占据4个字节,光是这2个东西都用了5个字节了,还没算上其他呢
拿来长岛冰茶换我半晚安睡
回复 支持 反对

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
 楼主| 发表于 2016-1-29 11:03:19 | 显示全部楼层
结构体,为什么就不能加const?

.h文件里声明一个结构体:
struct        MenuItem
{
        _UBYTE                                MenuCount;                //本层菜单项目数

        void                                (*Subs)();                //本层菜单执行函数

        struct        MenuItem        *ChildrenMenus;        //子菜单指针

        struct        MenuItem        *ParentMenus;        //父菜单指针

};


在.C文件里定义一个变量:
/*****************一级菜单***************/
//首页
const        struct        MenuItem        Menu_USER_Frist_struct[3]=
{
//        {2,USER_LCD_Frist_Function,(struct        MenuItem*) Menu_USER_Second1,(struct        MenuItem*)NULL},
        {2,USER_LCD_Frist_Function,(struct        MenuItem*) NULL,(struct        MenuItem*)NULL},
        {2,USER_LCD_Frist_Function,(struct        MenuItem*) Menu_USER_Second2,(struct        MenuItem*)NULL},
        {1,USER_LCD_Frist_Function,(struct        MenuItem*)&Menu_USER_Second3,(struct        MenuItem*)NULL},
};

怎么就废SRAM了?全部在ROM里。
30年众生牛马,60年诸佛龙象!
回复 支持 反对

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
 楼主| 发表于 2016-1-29 11:03:55 | 显示全部楼层
FreeRTOS 发表于 2016-1-29 10:52
结构体加const???恕我C语言基础薄弱,如果加了const还能修改里面的内容么?
比如菜单当前索引号占据 ...

结构体,为什么就不能加const?

.h文件里声明一个结构体:
struct        MenuItem
{
        _UBYTE                                MenuCount;                //本层菜单项目数

        void                                (*Subs)();                //本层菜单执行函数

        struct        MenuItem        *ChildrenMenus;        //子菜单指针

        struct        MenuItem        *ParentMenus;        //父菜单指针

};


在.C文件里定义一个变量:
/*****************一级菜单***************/
//首页
const        struct        MenuItem        Menu_USER_Frist_struct[3]=
{
//        {2,USER_LCD_Frist_Function,(struct        MenuItem*) Menu_USER_Second1,(struct        MenuItem*)NULL},
        {2,USER_LCD_Frist_Function,(struct        MenuItem*) NULL,(struct        MenuItem*)NULL},
        {2,USER_LCD_Frist_Function,(struct        MenuItem*) Menu_USER_Second2,(struct        MenuItem*)NULL},
        {1,USER_LCD_Frist_Function,(struct        MenuItem*)&Menu_USER_Second3,(struct        MenuItem*)NULL},
};

怎么就废SRAM了?全部在ROM里。
30年众生牛马,60年诸佛龙象!
回复 支持 反对

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
 楼主| 发表于 2016-1-29 11:06:14 | 显示全部楼层
FreeRTOS 发表于 2016-1-29 10:52
结构体加const???恕我C语言基础薄弱,如果加了const还能修改里面的内容么?
比如菜单当前索引号占据 ...

引用傻孩子的一句话:你真的理解了这个菜单了?
30年众生牛马,60年诸佛龙象!
回复 支持 反对

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2016-1-29 11:30:20 | 显示全部楼层
无痕幽雨 发表于 2016-1-29 11:06
引用傻孩子的一句话:你真的理解了这个菜单了?


QQ图片20160129112532.png
我用了你给的代码做了个测试,在菜单结构里面加了个索引号index来指示当前菜单索引到哪个子菜单,但只要对这个索引号进行修改就出现图中的错误,很明显存放在FLASH里面的数据是不能直接修改的,不知道是我理解错了还是你理解错了
拿来长岛冰茶换我半晚安睡
回复 支持 反对

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
 楼主| 发表于 2016-1-29 11:43:51 | 显示全部楼层
FreeRTOS 发表于 2016-1-29 11:30
我用了你给的代码做了个测试,在菜单结构里面加了个索引号index来指示当前菜单索引到哪个子菜单,但 ...

你好好看看傻孩子给的历程,就明白了。
30年众生牛马,60年诸佛龙象!
回复 支持 反对

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2016-1-29 12:18:45 | 显示全部楼层
无痕幽雨 发表于 2016-1-29 11:43
你好好看看傻孩子给的历程,就明白了。

傻孩子GUI没听过,周立功GUI倒是玩过,下面是周立功GUI的子菜单数据结构,里面的win变量和state变量(子菜单索引)都是根据实际进行动态修改的:
捕获.PNG

我看你的傻孩子的菜单数据结构,这菜单不能作动态修改,并且需要额外给所有菜单添加一个索引变量,也就是说这GUI不能用于窗口的场合,也没有回调函数的功能(函数指针)

我对GUI研究比较浅薄,不过百度上除了UCGUI外,最多人推荐的是RT-THREAD自带的GUI和周立功GUI,这就足以证明写这GUI的人不是傻逼,人家不用const自然是有原因的,所以我也不敢用我浅薄的知识去评论它

最后一点,其实我十分肯定你的这个GUI的简单结构!在不考虑临时修改菜单数据的前提下,给我的初步想法是你这个数据结构起码比我自己用二维数组做的要清晰很多,并且不会占用宝贵的SRAM,我目前不需要做复杂的菜单,所以接下来会研究下你这个GUI
拿来长岛冰茶换我半晚安睡
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1367
金钱
1367
注册时间
2014-2-13
在线时间
169 小时
发表于 2016-1-29 12:42:25 | 显示全部楼层
傻孩子的GUI本就不是窗口式的,更像是选项条式,就结构而言。不知我理解可对?
回复 支持 反对

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
 楼主| 发表于 2016-1-29 13:35:52 | 显示全部楼层
FreeRTOS 发表于 2016-1-29 12:18
傻孩子GUI没听过,周立功GUI倒是玩过,下面是周立功GUI的子菜单数据结构,里面的win变量和state变量(子菜 ...

我感觉这个不能称为GUI吧,最多算是菜单的一种是设计结构,核心思想就是把所有的菜单用指针级联。至于要实现很炫的界面,这个就太简陋了。
目前我的项目用不到GUI,也没有必要上,就想找个结构清晰合理,便于维护和升级的菜单结构。如果有兴趣一起讨论。。。。
30年众生牛马,60年诸佛龙象!
回复 支持 反对

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
 楼主| 发表于 2016-1-29 13:38:10 | 显示全部楼层
solo 发表于 2016-1-29 12:42
傻孩子的GUI本就不是窗口式的,更像是选项条式,就结构而言。不知我理解可对?

我感觉,傻孩子的菜单核心思路就是用双向链表的方式把所有的菜单级联起来,至于每个菜单要显示的内容,实现的额功能,需要自己去思考怎实现。不知道我的理解有没有偏差?
30年众生牛马,60年诸佛龙象!
回复 支持 反对

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2016-1-29 13:54:46 | 显示全部楼层
无痕幽雨 发表于 2016-1-29 13:35
我感觉这个不能称为GUI吧,最多算是菜单的一种是设计结构,核心思想就是把所有的菜单用指针级联。至于要 ...

算是菜单的基础结构吧,具体使用哪个GUI还得看实际应用的需要,我目前的单片机8KB的SRAM还带操作系统,因此用来跑UCGUI是不可能的,我看了下你发的DEMO,其实也是足够简单明了的了,来年回来我尝试下用它来替代我目前的菜单
拿来长岛冰茶换我半晚安睡
回复 支持 反对

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
 楼主| 发表于 2016-1-29 14:20:26 | 显示全部楼层
FreeRTOS 发表于 2016-1-29 13:54
算是菜单的基础结构吧,具体使用哪个GUI还得看实际应用的需要,我目前的单片机8KB的SRAM还带操作系统,因 ...

好,希望到时候,你可以把应用心得给大家分享下。
30年众生牛马,60年诸佛龙象!
回复 支持 反对

使用道具 举报

5

主题

163

帖子

0

精华

高级会员

Rank: 4

积分
615
金钱
615
注册时间
2011-11-7
在线时间
180 小时
发表于 2016-1-29 22:11:25 | 显示全部楼层
无痕幽雨 发表于 2016-1-29 09:13
几个界面可以用switch,界面多了,代码就有点乱,也不利于修改。

确实,而且界面往往还和按键或触屏输入,以及其它参数等有紧密的关联
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1367
金钱
1367
注册时间
2014-2-13
在线时间
169 小时
发表于 2016-1-30 08:16:33 | 显示全部楼层
无痕幽雨 发表于 2016-1-29 13:38
我感觉,傻孩子的菜单核心思路就是用双向链表的方式把所有的菜单级联起来,至于每个菜单要显示的内容,实 ...

楼主可以用这个出一个demo试试,那种稍复杂点的界面,我当初是没想到好的办法就放弃了,因为实现那种界面用这个肯定不行,改动太大。。。
回复 支持 反对

使用道具 举报

13

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2016-7-15
在线时间
175 小时
发表于 2016-9-5 19:50:35 | 显示全部楼层
solo 发表于 2016-1-30 08:16
楼主可以用这个出一个demo试试,那种稍复杂点的界面,我当初是没想到好的办法就放弃了,因为实现那种界面 ...

http://www.openedv.com/thread-79720-1-1.html
看看我这个
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1367
金钱
1367
注册时间
2014-2-13
在线时间
169 小时
发表于 2016-9-6 07:59:32 | 显示全部楼层

典型条形选项界面,属于最简单那种。ps:做的挺不错的

回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1367
金钱
1367
注册时间
2014-2-13
在线时间
169 小时
发表于 2016-9-6 08:03:05 | 显示全部楼层
李小龙 发表于 2016-9-5 19:50
http://www.openedv.com/thread-79720-1-1.html
看看我这个

那种windows效果的,有下拉、复选、编辑框
回复 支持 反对

使用道具 举报

13

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2016-7-15
在线时间
175 小时
发表于 2016-9-6 18:07:20 | 显示全部楼层
solo 发表于 2016-9-6 08:03
那种windows效果的,有下拉、复选、编辑框

用emwin吧
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1367
金钱
1367
注册时间
2014-2-13
在线时间
169 小时
发表于 2016-9-8 08:15:33 | 显示全部楼层

简单的可以自己写写,就是emwin那种运行机制不好弄
回复 支持 反对

使用道具 举报

32

主题

230

帖子

0

精华

高级会员

Rank: 4

积分
508
金钱
508
注册时间
2016-4-14
在线时间
113 小时
发表于 2017-4-17 17:43:17 | 显示全部楼层
无痕幽雨 发表于 2016-1-29 09:13
几个界面可以用switch,界面多了,代码就有点乱,也不利于修改。

卧槽。我就遇到了这个问题。我的菜单也不是很多。但是switch  case已经很多了。而且一改就要改一堆。。。
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2018-5-24
在线时间
7 小时
发表于 2021-2-9 18:19:11 | 显示全部楼层
我也来学习学习,最近要做个项目需要多级菜单
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2021-3-17
在线时间
2 小时
发表于 2021-4-14 08:11:22 | 显示全部楼层
无痕幽雨 发表于 2016-1-29 11:06
引用傻孩子的一句话:你真的理解了这个菜单了?

楼主,你这个const 定义的常量结构体,如果是3级以上菜单,keil编译不过的。定义当前菜单,包括父子菜单指针常量, 这个父子指针放在该定义上方,3级菜单可以(能起到先申明作用)。后面的4级菜单就不行了。描述起来比较绕。你试试4级菜单。不能用NULL指向空指针
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
319
金钱
319
注册时间
2018-5-27
在线时间
102 小时
发表于 2021-10-19 10:44:28 | 显示全部楼层
强啊,好好研究下你的代码,哈哈哈。感谢感谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 11:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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