C语言设计学习,教你如何将LCD菜单对象化

描述

这是我十三年前读研究生的时候写的系列文章《C语言嵌入式系统编程修炼》系列文章中的一小节,是一个用面向对象,把LCD上面菜单,对象化的例子。该文章原始出处:

http://soft.yesky.com/lesson/188/2023188.shtml

 菜单操作  无数人为之绞尽脑汁的问题终于出现了,在这一节里,我们将看到,在C语言中哪怕用到一丁点的面向对象思想,软件结构将会有何等的改观!  笔者曾经是个笨蛋,被菜单搞晕了,给出这样的一个系统:

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

  程序被大大简化了,也开始具有很好的可扩展性!我们仅仅利用了面向对象中的封装思想,就让程序结构清晰,其结果是几乎可以在无需修改程序的情况下在系统中添加更多的菜单,而系统的按键处理函数保持不变。  
面向对象,真神了! 


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分