因为要做一个小应用,需要一个菜单类,在网上找了许久,也没有找到一款心仪的菜单类,索性用C++语言,自制一个命令行级别的菜单类,并制作成库,现记录下来,供以后借鉴。
菜单类主要负责菜单的创建、修改、删除,是包含菜单结构组织和响应函数的模型,用户拥有充分的自主性,可根据需要自定义菜单显示和响应函数。其中菜单项使用vector容器数据结构,根据用户命令可进行菜单创建、修改、删除,而显示和响应函数则利用函数指针进行保存,体现了回调函数的特性。
/*脚本生成菜单*/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个参数分别是显示函数指针数组和响应函数指针数组。为便于理解,下面我将用户自定义菜单结构展开:
{log{},operate{save,unsave},menu{constrast{1,2,3,4},clearAll,rePower,shutdown,adjust{confirm},about{(c)hele2024}}}每一个'{'都意味着该项目有子菜单,每一个'}'意味着该菜单结束,每一个','都意味着有同级菜单,以上这3个符号均是关键词,均是英文字符。所有菜单除内容中间可以有空格外,其余地方不能有多余的空格。支持中文。
运用C++面向对象思维进行编程,代码体积大,效率低;
利用脚本生成菜单是个新颖的思路,但容错性不好,没有对脚本进行规范化的检查,对用户不友好;
可以利用ArduinoSTL库,将此库移植进Arduino系列单片机项目中;
使用了动态分配内存技术,对于RAM较小的单片机,容易内存溢出。