完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在做一个多级菜单项目,看了很多资料,大体分两种设计思路: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 ) |
|
相关推荐
34个回答
|
|
傻孩子GUI没听过,周立功GUI倒是玩过,下面是周立功GUI的子菜单数据结构,里面的win变量和state变量(子菜单索引)都是根据实际进行动态修改的:
我看你的傻孩子的菜单数据结构,这菜单不能作动态修改,并且需要额外给所有菜单添加一个索引变量,也就是说这GUI不能用于窗口的场合,也没有回调函数的功能(函数指针) 我对GUI研究比较浅薄,不过百度上除了UCGUI外,最多人推荐的是RT-THREAD自带的GUI和周立功GUI,这就足以证明写这GUI的人不是***,人家不用const自然是有原因的,所以我也不敢用我浅薄的知识去评论它 最后一点,其实我十分肯定你的这个GUI的简单结构!在不考虑临时修改菜单数据的前提下,给我的初步想法是你这个数据结构起码比我自己用二维数组做的要清晰很多,并且不会占用宝贵的SRAM,我目前不需要做复杂的菜单,所以接下来会研究下你这个GUI |
|
|
|
傻孩子的GUI本就不是窗口式的,更像是选项条式,就结构而言。不知我理解可对?
|
|
|
|
我感觉这个不能称为GUI吧,最多算是菜单的一种是设计结构,核心思想就是把所有的菜单用指针级联。至于要实现很炫的界面,这个就太简陋了。
目前我的项目用不到GUI,也没有必要上,就想找个结构清晰合理,便于维护和升级的菜单结构。如果有兴趣一起讨论。。。。 |
|
|
|
我感觉,傻孩子的菜单核心思路就是用双向链表的方式把所有的菜单级联起来,至于每个菜单要显示的内容,实现的额功能,需要自己去思考怎实现。不知道我的理解有没有偏差?
|
|
|
|
算是菜单的基础结构吧,具体使用哪个GUI还得看实际应用的需要,我目前的单片机8KB的SRAM还带操作系统,因此用来跑UCGUI是不可能的,我看了下你发的DEMO,其实也是足够简单明了的了,来年回来我尝试下用它来替代我目前的菜单
|
|
|
|
好,希望到时候,你可以把应用心得给大家分享下。
|
|
|
|
确实,而且界面往往还和按键或触屏输入,以及其它参数等有紧密的关联
|
|
|
|
楼主可以用这个出一个demo试试,那种稍复杂点的界面,我当初是没想到好的办法就放弃了,因为实现那种界面用这个肯定不行,改动太大。。。
|
|
|
|
|
|
|
|
典型条形选项界面,属于最简单那种。ps:做的挺不错的
|
|
|
|
那种windows效果的,有下拉、复选、编辑框
|
|
|
|
用emwin吧
|
|
|
|
简单的可以自己写写,就是emwin那种运行机制不好弄
|
|
|
|
卧槽。我就遇到了这个问题。我的菜单也不是很多。但是switch case已经很多了。而且一改就要改一堆。。。
|
|
|
|
switch+goto 会比较容易看
|
|
|
|
只有小组成员才能发言,加入小组>>
3308 浏览 9 评论
2988 浏览 16 评论
3490 浏览 1 评论
9049 浏览 16 评论
4083 浏览 18 评论
1167浏览 3评论
601浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
592浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2329浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1892浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-17 16:45 , Processed in 1.842401 second(s), Total 107, Slave 88 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号