谈谈嵌入式应用软件人机界面开发的菜单框架编写
扫描二维码
随时随地手机看文章
微信公众号:嵌入式开发圈
关注可了解更多的教程。问题或建议,请公众号留言;
如果你觉得本文对你有帮助,欢迎赞赏由于之前的文章没有好看的格式,故现在重新发表,让圈友看起来更加舒服,也可以直接复制粘贴商用。
▲长按图片保存可分享至朋友圈
一般来说我们的产品都有按键,按键用来操作相应的界面,那就会有相应的界面处理方法,以下有两种结构的编写:
A类编写
1//针对左键的处理函数,传入的参数为当前页面
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//针对右键的处理函数,传入的参数为当前页面
27void right_key_process(int current_page)
28{
29 //....
30}
31//针对确认键的处理函数,传入的参数为当前页面
32void enter_key_process(int current_page)
33{
34 //....
35}
36//UI页面处理函数,传入的参数为当前的键值
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类编写,我可以起个名字叫直男式编写,逻辑没有错,也能正常操作相应的页面,没有问题,可它就是一条线,直! 首先拿到键值,然后操作界面,和我们正常人的思维差不多。但如果代码量剧增,页面众多,每个页面有不同的处理按键,相信A类的编写给后面的人来维护或者增加处理方法人一定会非常抱怨,为啥找个界面处理这么痛苦?
我们再来看看B类,我可以起个名字叫人机接口式编写。首先我们要操作界面,界面就是人机接口,每个不同的界面由对应的按键操作方法,这样看起来,是不是更好维护了?以后,我要往界面添加、删除等相关按键的处理方法,那是不是就更好找了?
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//设置页面处理
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类看起来更加的易维护,但仍然存在缺陷,那就是一旦菜单项数变多以后,就存在效率低下的问题了,我们有一种更好的解决方法函数跳转表,我们将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 ; //菜单对应的函数
27};
28
29//构造函数跳转表
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 //根据索引值op,调用相应的函数
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 //执行菜单操作
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 << "设置页面" << endl ;
81}
如果圈友有什么更好的应用框架,欢迎留言推荐,一起共同学习!
另外推荐一部近期出的典型巨作,冬瓜哥的大话计算机,可以说是一部经典了,虽然贵,但我也入手了一部,看了第一章,基本上我觉得可以秒杀国产同类书籍了,甚至可以类比国外的一些经典书籍,强烈推荐入手!
另外推荐相关课程:
韦东山老师优质嵌入式学习干货推荐:包括ARM裸机开发、Linux设备驱动程序、Linux应用程序开发、Android系统学习、Linux设备树等。
在我这里购买韦东山老师的课程还可得到本人的技术支持,手把手带你学习嵌入式!
王争老师优秀数据结构算法学习课程推荐
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!