因为要做一个小应用,需要一个菜单类,在网上找了许久,也没有找到一款心仪的菜单类,索性用C++语言,自制一个命令行级别的菜单类,并制作成库,现记录下来,供以后借鉴。
菜单类主要负责菜单的创建、修改、删除,是包含菜单结构组织和响应函数的模型,用户拥有充分的自主性,可根据需要自定义菜单显示和响应函数。其中菜单项使用vector容器数据结构,根据用户命令可进行菜单创建、修改、删除,而显示和响应函数则利用函数指针进行保存,体现了回调函数的特性。
菜单浏览器类主要负责菜单结构的浏览导航。私有变量是2个菜单类指针,1个是根目录指针,1个是当前目录指针。
网上的资料有很多了,在此仅简单记录。
主要有2种方法实现用户自定义的菜单类,共同点是attachDisplay和attachAction所带的参数均为用户自定义的函数。
主要利用菜单类parseMenu函数实现,写了1个解析器,可以实现菜单类的自动生成。
/*脚本生成菜单*/void(*p_display[])(string&,vector&,unsignedint&)={/*root*/display_root,/*log*/display,/*operate*/display,/*menu*/display,/*constrast*/display_compare,/*adjust*/display,/*about*/display};void(*p_action[])()={/*root*/action_root,/*log*/action,/*operate*/action_operate,/*menu*/action,/*constrast*/action_compare,/*adjust*/action_adjust,/*about*/action};HeleMenu*m1=HeleMenu::parseMenu("{历史{},操作{save,unsave},菜单{对比度{1,2,3,4},clearAll,rePower,shutdown,校准{confirm},关于{(c)hele2024,这是一个菜单}}}",p_display,p_action);HeleMenuViewer::init(m1);HeleMenuViewer::gotoRoot();//到达根菜单while(true){//启动system("cls");HeleMenuViewer::display();HeleMenuViewer::action();}parseMenu所带的参数共3个,第1个是菜单结构字符串,也就是生成菜单结构的脚本,后面2个参数分别是显示函数指针数组和响应函数指针数组。为便于理解,下面我将用户自定义菜单结构展开:
主要使用上、下、左、右、空格、回车、退出这些按键,只实现部分功能。
运用C++面向对象思维进行编程,代码体积大,效率低;
利用脚本生成菜单是个新颖的思路,但容错性不好,没有对脚本进行规范化的检查,对用户不友好;
可以利用ArduinoSTL库,将此库移植进Arduino系列单片机项目中;
使用了动态分配内存技术,对于RAM较小的单片机,容易内存溢出。