谈谈嵌入式应用软件人机界面开发的菜单框架编写

一般来说我们的产品都有按键,按键用来操作相应的界面,那就会有相应的界面处理方法,以下有两种结构的编写:

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 <iostream>
 2#include <conio.h>
 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}

如果圈友有什么更好的应用框架,欢迎留言推荐,一起共同学习!

本文分享自微信公众号 - 嵌入式开发圈(gh_d6ff851b4069)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

操作系统原理、数据结构、网络原理,深入理解计算机系统应该按什么顺序去看?

计科专业从事软件开发多年,上面说的几本书都是学习计算机的必备知识,如果还在上大学阶段的小伙伴看到这篇文章,现在就以一个程序员的身份来讲讲这四本书在平时开发中如何...

17730
来自专栏电商工具

15个国外顶级的大数据分析工具

嵌入式分析 在传统业务应用程序(如HR系统,CRM或ERP)的范围内提供商业智能。这些分析在用户的正常工作流程中提供上下文敏感的决策支持。

28040
来自专栏嵌入式大杂烩

【工具】这么好用的代码阅读器你装了吗?

作为一名程序员,我们不仅要多动手编代码,而且还应多阅读一些优秀的代码,如C语言的一些第三方库文件、嵌入式中Linux内核源码以及一些项目的代码等。这些源码往往都...

1.4K20
来自专栏吉浦迅科技

GTX1080ti、Jetson NANO和树莓派跑深度学习性能差别有多大?

这个报告记录了DeepDetect开源深度学习服务在各种计算平台和流行神经网络架构上的性能。

2.1K20
来自专栏程序员互动联盟

JAVA、C、C++、Python同样是高级语言,为什么只有C和C++可以编写单片机程序?

从事编程十几年,JAVA、C、C++、Python这四种编程语言都玩过,前三种玩的比较多,python做为兴趣爱好或者玩脚本的时候弄过,编程语言在使用的时候主要...

53410
来自专栏嵌入式开发圈

中断与异常简介与分析

在高执行级别下,代码可以执行特权指令,访问任意的物理地址,这种CPU执行级别就对应着内核态。

12930
来自专栏边缘计算

终于有人把物联网和边缘计算的关系说清楚了

今年特别火的物联网是什么?边缘计算和物联网有什么关系?也许之前你有点搞不清,看完这篇文章相信您会对边缘计算和物联网有新的认识。

13840
来自专栏程序员互动联盟

最近有程序员自降80%薪水转行做游戏,那些跨行的游戏作者真的有出路吗?

从事软件开发多年,开发游戏能加班加到人吐血,虽然普通大众都喜欢玩游戏但对于普通的游戏开发者来讲加班加点已经是家常便饭,特别是做国外优秀山寨这块基本上一周至少工作...

19730
来自专栏嵌入式大杂烩

【C语言笔记】操作位的技巧

操作位有两种方法,一种是位字段,另一种是使用按位运算符。位字段的方法可查看往期笔记:【C语言笔记】位域。本文介绍使用按位运算符操作位的方法。下表为几种位操作符及...

24720
来自专栏程序员互动联盟

如何从零开始开发一个操作系统?

操作算是在软件开发里面功能非常齐全难度非常大的一个超级工程,目前国内掌握操纵系统技术的科技公司也是少的可怜,而且不完全是技术层面的东西了,还需要构建生态链,国内...

40930

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励