这是我十三年前读研究生的时候写的系列文章《c语言嵌入式系统编程修炼》系列文章中的一小节,是一个用面向对象,把lcd上面菜单,对象化的例子。该文章原始出处:
http://soft.yesky.com/lesson/188/2023188.shtml
菜单操作无数人为之绞尽脑汁的问题终于出现了,在这一节里,我们将看到,在c语言中哪怕用到一丁点的面向对象思想,软件结构将会有何等的改观!笔者曾经是个笨蛋,被菜单搞晕了,给出这样的一个系统:
要求以键盘上的← →键切换菜单焦点,当用户在焦点处于某菜单时,若敲击键盘上的ok、cancel键则调用该焦点菜单对应之处理函数。我曾经傻傻地这样做着:
/* 按下ok键 */void onokkey(){ /* 判断在什么焦点菜单上按下ok键,调用相应处理函数 */ switch(currentfocus) {case menu1: menu1onok(); break;case menu2: menu2onok(); break;… }}/* 按下cancel键 */void oncancelkey(){ /* 判断在什么焦点菜单上按下cancel键,调用相应处理函数 */ switch(currentfocus) {case menu1: menu1oncancel(); break;case menu2: menu2oncancel(); break;… }}
终于有一天,我这样做了:
/* 将菜单的属性和操作封装在一起 */typedef struct tagsysmenu{ char *text; /* 菜单的文本 */ byte xpos; /* 菜单在lcd上的x坐标 */ byte ypos; /* 菜单在lcd上的y坐标 */ void (*onokfun)(); /* 在该菜单上按下ok键的处理函数指针 */ void (*oncancelfun)(); /* 在该菜单上按下cancel键的处理函数指针 */}sysmenu, *lpsysmenu;
当我定义菜单时,只需要这样:
static sysmenu menu[menu_num] ={ {menu1, 0, 48, menu1onok, menu1oncancel } , { menu2, 7, 48, menu2onok, menu2oncancel } , { menu3, 7, 48, menu3onok, menu3oncancel } , { menu4, 7, 48, menu4onok, menu4oncancel } …};
ok键和cancel键的处理变成:
/* 按下ok键 */void onokkey(){ menu[currentfocusmenu].onokfun();}/* 按下cancel键 */void oncancelkey(){ menu[currentfocusmenu].oncancelfun();}
程序被大大简化了,也开始具有很好的可扩展性!我们仅仅利用了面向对象中的封装思想,就让程序结构清晰,其结果是几乎可以在无需修改程序的情况下在系统中添加更多的菜单,而系统的按键处理函数保持不变。
面向对象,真神了!
有道词典笔3在拼多多首发同步预售
为了讨好中国市场 苹果在新版ios11系统中加入了这几个功能
人工智能技术发展需要面临哪些难关
01:MC3377x电池单元控制器的介绍
NZXT发布3款全新ATX PSU电源,售价837元人民币起
C语言设计学习,教你如何将LCD菜单对象化
rainysky陪你一起在zedboard上移植qt+opencv(二)
报告:75%消费者希望用电视完成购物
超逼真的星战机器人,了解下
集成功率无源器件和战术权衡以提高功率效率:电源管理和开关电源
华宇电子亮相2022世界集成电路大会
华为mate9和p9的区别,16nm工艺处理器给力升级但mate9曲屏版或跳票
C语言零基础项目:生命游戏!详细思路+源码分享
基于PLC的机器人伺服运动控制系统设计详解
用MDaemon搭建邮件服务器-设置篇
松下进一步增强加码动力电池业务的决心
谷歌发布第三季度财报,总营收461.73亿美元
华为 P20在上海发布 还有全球首款全面屏笔记本
怎么应对刘海屏机型的海报设计
相控阵雷达性能的基石:宽禁带半导体