这是我十三年前读研究生的时候写的系列文章《C语言嵌入式系统编程修炼》系列文章中的一小节,是一个用面向对象,把LCD上面菜单,对象化的例子。该文章原始出处:
无数人为之绞尽脑汁的问题终于出现了,在这一节里,我们将看到,在C语言中哪怕用到一丁点的面向对象思想,软件结构将会有何等的改观!
笔者曾经是个笨蛋,被菜单搞晕了,给出这样的一个系统:
图1菜单范例
要求以键盘上的"←→"键切换菜单焦点,当用户在焦点处于某菜单时,若敲击键盘上的OK、CANCEL键则调用该焦点菜单对应之处理函数。我曾经傻傻地这样做着:
/*按下OK键*/voidonOkKey(){ /*判断在什么焦点菜单上按下Ok键,调用相应处理函数*/ Switch(currentFocus) {
caseMENU1:
menu1OnOk();
break;
caseMENU2:
menu2OnOk();
break;
… }}/*按下Cancel键*/voidonCancelKey(){ /*判断在什么焦点菜单上按下Cancel键,调用相应处理函数*/ Switch(currentFocus) {
caseMENU1:
menu1OnCancel();
break;
caseMENU2:
menu2OnCancel();
break;
… }}
终于有一天,我这样做了:
/*将菜单的属性和操作"封装"在一起*/typedefstructtagSysMenu{ char*text;/*菜单的文本*/ BYTExPos;/*菜单在LCD上的x坐标*/ BYTEyPos;/*菜单在LCD上的y坐标*/ void(*onOkFun)();/*在该菜单上按下ok键的处理函数指针*/ void(*onCancelFun)();/*在该菜单上按下cancel键的处理函数指针*/}SysMenu,*LPSysMenu;
当我定义菜单时,只需要这样:
staticSysMenumenu[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键*/voidonOkKey(){ menu[currentFocusMenu].onOkFun();}/*按下Cancel键*/voidonCancelKey(){ menu[currentFocusMenu].onCancelFun();}
程序被大大简化了,也开始具有很好的可扩展性!我们仅仅利用了面向对象中的封装思想,就让程序结构清晰,其结果是几乎可以在无需修改程序的情况下在系统中添加更多的菜单,而系统的按键处理函数保持不变。
面向对象,真神了!
点击阅读原文,进入《C语言嵌入式系统编程修炼》系列
预览时标签不可点收录于话题#个上一篇下一篇