談?wù)勄度胧綉?yīng)用軟件人機(jī)界面開發(fā)的菜單框架編寫
微信公眾號:嵌入式開發(fā)圈
關(guān)注可了解更多的教程。問題或建議,請公眾號留言;
如果你覺得本文對你有幫助,歡迎贊賞由于之前的文章沒有好看的格式,故現(xiàn)在重新發(fā)表,讓圈友看起來更加舒服,也可以直接復(fù)制粘貼商用。
▲長按圖片保存可分享至朋友圈
一般來說我們的產(chǎn)品都有按鍵,按鍵用來操作相應(yīng)的界面,那就會有相應(yīng)的界面處理方法,以下有兩種結(jié)構(gòu)的編寫:
A類編寫
1//針對左鍵的處理函數(shù),傳入的參數(shù)為當(dāng)前頁面
2void left_key_process(int current_page)
3{
4 switch(current_page)
5 {
6 case MAIN_PAGE:
7 //針對main_page的左鍵處理
8 main_page_left_key_process();
9 break ;
10 case SETTING_PAGE:
11 //針對setting_page的左鍵處理
12 setting_page_left_key_process();
13 break ;
14 case LOG_PAGE:
15 //針對log_page的左鍵處理
16 log_page_left_key_process();
17 break ;
18 case LANGUAGE_PAGE:
19 //針對language_page的左鍵處理
20 language_page_left_key_process();
21 break ;
22 ....
23 }
24}
25
26//針對右鍵的處理函數(shù),傳入的參數(shù)為當(dāng)前頁面
27void right_key_process(int current_page)
28{
29 //....
30}
31//針對確認(rèn)鍵的處理函數(shù),傳入的參數(shù)為當(dāng)前頁面
32void enter_key_process(int current_page)
33{
34 //....
35}
36//UI頁面處理函數(shù),傳入的參數(shù)為當(dāng)前的鍵值
37void UI_Page_Process(int KeyValue)
38{
39 switch(KeyValue)
40 {
41 case LEFT_KEY :
42 left_key_process(KeyValue);
43 break ;
44
45 case RIGHT_KEY:
46 right_key_process(KeyValue);
47 break ;
48 case ENTER_KEY:
49 enter_key_process(KeyValue);
50 break ;
51 ...
52 }
53}
A類編寫,我可以起個(gè)名字叫直男式編寫,邏輯沒有錯(cuò),也能正常操作相應(yīng)的頁面,沒有問題,可它就是一條線,直! 首先拿到鍵值,然后操作界面,和我們正常人的思維差不多。但如果代碼量劇增,頁面眾多,每個(gè)頁面有不同的處理按鍵,相信A類的編寫給后面的人來維護(hù)或者增加處理方法人一定會非常抱怨,為啥找個(gè)界面處理這么痛苦?
我們再來看看B類,我可以起個(gè)名字叫人機(jī)接口式編寫。首先我們要操作界面,界面就是人機(jī)接口,每個(gè)不同的界面由對應(yīng)的按鍵操作方法,這樣看起來,是不是更好維護(hù)了?以后,我要往界面添加、刪除等相關(guān)按鍵的處理方法,那是不是就更好找了?
B類編寫
1//主頁面處理
2void main_page_process(int KeyValue)
3{
4 switch(KeyValue)
5 {
6 case LEFT_KEY:
7 //針對main_page的左鍵處理
8 break ;
9 case RIGHT_KEY:
10 //針對main_page的右鍵處理
11 break ;
12 case ENTER_KEY:
13 //針對main_page的Enter鍵處理
14 break ;
15 case BACK_KEY:
16 //針對main_page的back鍵處理
17 break ;
18 ...
19 }
20}
21//設(shè)置頁面處理
22void setting_page_process(int KeyValue)
23{
24 switch(KeyValue)
25 {
26 case LEFT_KEY:
27 ...
28 break ;
29 case RIGHT_KEY:
30 ...
31 break ;
32 case ENTER_KEY:
33 ...
34 break ;
35 case BACK_KEY:
36 ...
37 break ;
38 ...
39 }
40}
41//記錄頁面處理
42void Log_page_process(int KeyValue)
43{
44 switch(KeyValue)
45 {
46 case LEFT_KEY:
47 ...
48 break ;
49 case RIGHT_KEY:
50 ...
51 break ;
52 case ENTER_KEY:
53 ...
54 break ;
55 case BACK_KEY:
56 ...
57 break ;
58 ...
59 }
60}
61//UI主頁面處理 ,傳入鍵值
62void UI_Page_Process(int KeyValue)
63{
64
65 switch(current_page)
66 {
67 case MAIN_PAGE:
68 main_page_process(KeyValue);
69 break ;
70 case SETTING_PAGE:
71 setting_page_process(KeyValue);
72 break ;
73 case LOG_PAGE:
74 Log_page_process(KeyValue);
75 break ;
76 ....
77 }
78}
雖然說B類看起來更加的易維護(hù),但仍然存在缺陷,那就是一旦菜單項(xiàng)數(shù)變多以后,就存在效率低下的問題了,我們有一種更好的解決方法函數(shù)跳轉(zhuǎn)表,我們將B類的方式改一下,引入C類編寫。
C類編寫
1#include
2#include
3using namespace std ;
4#define NR(x) (sizeof(x)/sizeof(x[0]))
5
6int main_page_process();
7int detect_page_process();
8int log_page_process();
9int setting_page_process();
10
11//菜單枚舉
12typedef enum
13{
14 MAIN_PAGE = 0,
15 DETECT_PAGE,
16 LOG_PAGE,
17 SETTING_PAGE
18}MENU_INDEX;
19
20typedef int(*OPERATE_FUNC)();
21
22class MENU
23{
24 public:
25 MENU_INDEX index ; //菜單索引
26 OPERATE_FUNC op_func ; //菜單對應(yīng)的函數(shù)
27};
28
29//構(gòu)造函數(shù)跳轉(zhuǎn)表
30static MENU OP_MENU_STRUCT[] =
31{
32 {MAIN_PAGE , main_page_process},
33 {DETECT_PAGE , detect_page_process},
34 {LOG_PAGE , log_page_process},
35 {SETTING_PAGE, setting_page_process},
36};
37
38int Goto_execute(int op)
39{
40 if(op >= NR(OP_MENU_STRUCT) || op < 0)
41 return -1 ;
42 //根據(jù)索引值op,調(diào)用相應(yīng)的函數(shù)
43 return OP_MENU_STRUCT[op].op_func();
44}
45
46int main(int argc , char **argv)
47{
48 char ch ;
49 int menu_index = 0;
50 while(1)
51 {
52 ch = getch();
53 if(ch == 'a') //左鍵
54 menu_index > 0 ? menu_index-- : menu_index = 0 ;
55 else if(ch == 'd')//右鍵
56 menu_index < NR(OP_MENU_STRUCT) ? menu_index++ : menu_index = NR(OP_MENU_STRUCT);
57 //執(zhí)行菜單操作
58 Goto_execute(menu_index);
59 }
60 return 0 ;
61}
62
63int main_page_process()
64{
65 cout << "主頁面" << endl ;
66}
67
68int detect_page_process()
69{
70 cout << "檢測頁面" << endl ;
71}
72
73int log_page_process()
74{
75 cout << "記錄頁面" << endl ;
76}
77
78int setting_page_process()
79{
80 cout << "設(shè)置頁面" << endl ;
81}
如果圈友有什么更好的應(yīng)用框架,歡迎留言推薦,一起共同學(xué)習(xí)!
另外推薦一部近期出的典型巨作,冬瓜哥的大話計(jì)算機(jī),可以說是一部經(jīng)典了,雖然貴,但我也入手了一部,看了第一章,基本上我覺得可以秒殺國產(chǎn)同類書籍了,甚至可以類比國外的一些經(jīng)典書籍,強(qiáng)烈推薦入手!
另外推薦相關(guān)課程:
韋東山老師優(yōu)質(zhì)嵌入式學(xué)習(xí)干貨推薦:包括ARM裸機(jī)開發(fā)、Linux設(shè)備驅(qū)動程序、Linux應(yīng)用程序開發(fā)、Android系統(tǒng)學(xué)習(xí)、Linux設(shè)備樹等。
在我這里購買韋東山老師的課程還可得到本人的技術(shù)支持,手把手帶你學(xué)習(xí)嵌入式!
王爭老師優(yōu)秀數(shù)據(jù)結(jié)構(gòu)算法學(xué)習(xí)課程推薦
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!