這是我十三年前讀研究生的時(shí)候?qū)懙南盗形恼隆?a href="http://wenjunhu.com/soft/data/21-24/" target="_blank">C語(yǔ)言嵌入式系統(tǒng)編程修煉》系列文章中的一小節(jié),是一個(gè)用面向?qū)ο?,把LCD上面菜單,對(duì)象化的例子。
菜單操作無(wú)數(shù)人為之絞盡腦汁的問題終于出現(xiàn)了,在這一節(jié)里,我們將看到,在C語(yǔ)言中哪怕用到一丁點(diǎn)的面向?qū)ο笏枷?,軟件結(jié)構(gòu)將會(huì)有何等的改觀!筆者曾經(jīng)是個(gè)笨蛋,被菜單搞暈了,給出這樣的一個(gè)系統(tǒng):
|
要求以鍵盤上的"← →"鍵切換菜單焦點(diǎn),當(dāng)用戶在焦點(diǎn)處于某菜單時(shí),若敲擊鍵盤上的OK、CANCEL鍵則調(diào)用該焦點(diǎn)菜單對(duì)應(yīng)之處理函數(shù)。我曾經(jīng)傻傻地這樣做著:
/* 按下OK鍵 */void onOkKey(){/* 判斷在什么焦點(diǎn)菜單上按下Ok鍵,調(diào)用相應(yīng)處理函數(shù) */Switch(currentFocus){case MENU1:menu1OnOk();break;case MENU2:menu2OnOk();break;…}}/* 按下Cancel鍵 */void onCancelKey(){/* 判斷在什么焦點(diǎn)菜單上按下Cancel鍵,調(diào)用相應(yīng)處理函數(shù) */Switch(currentFocus){case MENU1:menu1OnCancel();break;case MENU2:menu2OnCancel();break;…}} |
終于有一天,我這樣做了:
/* 將菜單的屬性和操作"封裝"在一起 */typedef struct tagSysMenu{char *text; /* 菜單的文本 */BYTE xPos; /* 菜單在LCD上的x坐標(biāo) */BYTE yPos; /* 菜單在LCD上的y坐標(biāo) */void (*onOkFun)(); /* 在該菜單上按下ok鍵的處理函數(shù)指針 */void (*onCancelFun)(); /* 在該菜單上按下cancel鍵的處理函數(shù)指針 */}SysMenu, *LPSysMenu; |
當(dāng)我定義菜單時(shí),只需要這樣:
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();} |
程序被大大簡(jiǎn)化了,也開始具有很好的可擴(kuò)展性!我們僅僅利用了面向?qū)ο笾械姆庋b思想,就讓程序結(jié)構(gòu)清晰,其結(jié)果是幾乎可以在無(wú)需修改程序的情況下在系統(tǒng)中添加更多的菜單,而系統(tǒng)的按鍵處理函數(shù)保持不變。面向?qū)ο?,真神了?
-
lcd
+關(guān)注
關(guān)注
34文章
4427瀏覽量
167719 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7605瀏覽量
137049 -
嵌入式編程
+關(guān)注
關(guān)注
0文章
27瀏覽量
10328
原文標(biāo)題:C語(yǔ)言對(duì)象化設(shè)計(jì)的實(shí)例——LCD菜單
文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論