找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4738|回复: 1
打印 上一主题 下一主题
收起左侧

VS 2010文本多级菜单程序系统设计,理论可实现1~255个菜单级数和目录数

[复制链接]
跳转到指定楼层
楼主
基于VS 2010的文本菜单系统,理论上最大可以实现1~255个菜单级数和目录数

全部源码下载(整个工程文件):
menu-systemV1.0.rar (1002.01 KB, 下载次数: 29)



部分源程序预览:
  1. //---------------------------------------------------//
  2. //产品:多级菜单程序
  3. //作者:詹磊
  4. //版本:v1.0
  5. //说明:本程序仅供测试使用,在创建链表时出现错误将产生未知后果
  6. //修改历史:1、7/30                创建
  7. //                        2、7/31                添加自动计算菜单目录信息功能
  8. //                        3、8/12                代码整理
  9. //功能描述:理论上可以实现255级树形单列文本菜;
  10. //                        单每个菜单最大目录数为255个;
  11. //                        通过定义MaxDisplayNumber来设置每面菜单显示的目录数;
  12. //运行环境:VC2010
  13. //---------------------------------------------------//
  14. #include "..\Include\menu.h"                /*菜单头文件*/
  15. //--主菜单--//
  16. MenuInfo mainMenu;                                        //菜单结构体
  17. char MeunName[]="主菜单";                        //菜单名字表
  18. //--一级菜单--//
  19. MenuInfo Clock,Calendar,Music,Radio,Games,Set,System;                                                                //菜单结构体
  20. char *mainMenuSubdirectory[7]={"时钟","日历","音乐","收音","游戏","设置","系统"};        //菜单名字表
  21. //--二级菜单--//
  22. MenuInfo SetClock,SetDate,SetAlarm,SetSystem;                                                        //菜单结构体
  23. char *SetSubdirectory[4]={"时间","日期","闹钟","系统"};        //菜单名字表
  24. //--三级菜单--//
  25. MenuInfo SetSecond,SetMinute,SetHour;                                        //菜单结构体
  26. char *SetClockSubdirectory[3]={"秒","分","时"};                        //菜单名字表
  27. MenuInfo SetYear,SetMonth,SetDay,SetWeek;                                //菜单结构体
  28. char *SetDateSubdirectory[4]={"年","月","日","星期"};        //菜单名字表
  29. MenuInfo SetAlarmSecond,SetAlarmMinute,SetAlarmHour;        //菜单结构体
  30. char *SetAlarmSubdirectory[3]={"秒","分","时"};                        //菜单名字表
  31. //-------------------------------------------//
  32. //函数名:创建菜单反向链式表函数
  33. //入口:MenuInfo *pM:菜单子目录的链式表头
  34. //出口:Void
  35. //功能:*pM必须为链式表头,否则会造成目录缺项
  36. //-------------------------------------------//
  37. void makeReversChainTable(MenuInfo *pM)
  38. {
  39.         MenuInfo *tempM;
  40.         pM->last=mNULL;
  41.         pM->meunStatus=mNULL;
  42.         pM->pFunction=fNULL;
  43.         if(pM->next==mNULL)
  44.         {
  45.                 return;
  46.         }        
  47.         while(pM->next!=mNULL)
  48.         {
  49.                 pM->meunStatus=mNULL;
  50.                 pM->pFunction=fNULL;
  51.                 tempM=pM->next;
  52.                 tempM->last=pM;
  53.                 pM=pM->next;
  54.         }
  55. }
  56. //-------------------------------------------//
  57. //函数名:创建菜单父节点函数
  58. //入口:MenuInfo *pParentM:父节点结构体
  59. //                MenuInfo *pM:菜单子目录的链式表头
  60. //出口:Void
  61. //功能:*pM必须为链式表头,否则会造成目录缺项
  62. //-------------------------------------------//
  63. void makeParentNode(MenuInfo *pParentM,MenuInfo *pM)
  64. {
  65.         if(pM->last!=mNULL)
  66.                 return;
  67.         else
  68.         {
  69.                 pParentM->meunStatus=pM;
  70.                 while(pM->next!=mNULL)
  71.                 {
  72.                         pM->parentMenus=pParentM;
  73.                         pM=pM->next;
  74.                 }
  75.                 pM->parentMenus=pParentM;
  76.         }
  77. }
  78. //-------------------------------------------//
  79. //函数名:创建菜单目录信息函数
  80. //入口:MenuInfo *pM:菜单子目录的链式表头
  81. //出口:Void
  82. //功能:*pM必须为链式表头,否则会造成未知后果
  83. //-------------------------------------------//
  84. void makeDirectoryNumber(MenuInfo *pM)
  85. {
  86.         UINT8 i=1;
  87.         if((pM->last!=mNULL)||(pM->parentMenus==mNULL))
  88.                 return ;
  89.         else
  90.         {
  91.                 while(pM->next!=mNULL)
  92.                 {
  93.                         pM->serialNumber=i;
  94.                         pM=pM->next;
  95.                         i++;
  96.                 }
  97.                 pM->parentMenus->directoryNumber=pM->serialNumber=i;
  98.         }
  99. }
  100. //-------------------------------------------//
  101. //函数名:获取菜单名字函数
  102. //入口:char **pChar:菜单名字所在的数组的指针
  103. //                MenuInfo *pM:菜单子目录的链式表头
  104. //出口:Void
  105. //功能:*pM必须为链式表头,否则会造成未知后果
  106. //-------------------------------------------//
  107. void getMenuName(char **pChar,MenuInfo *pM)
  108. {
  109.         UINT8 i;
  110.         i=0;
  111.         if(pM->last!=mNULL)
  112.                 return;
  113.         else
  114.         {
  115.                 while(pM->next!=mNULL)
  116.                 {
  117.                         pM->pMeunName=pChar[i];
  118.                         pM=pM->next;
  119.                         i++;
  120.                 }
  121.                 pM->pMeunName=pChar[i];
  122.         }
  123. }
  124. //-------------------------------------------//
  125. //函数名:创建菜单链式表函数
  126. //入口:Void
  127. //出口:Void
  128. //功能:相同的父节点的结构体组成一个链式表;
  129. //                必须创建仔细否则将产生未知后果。
  130. //-------------------------------------------//
  131. void makeMenuList()
  132. {
  133. //----目录链式表----//
  134.         mainMenu.next=mNULL;
  135.         mainMenu.last=mNULL;
  136.         //------------------//
  137.         Clock.next=&Calendar;
  138.         Calendar.next=&Music;
  139.         Music.next=&Radio;
  140.         Radio.next=&Games;
  141.         Games.next=&Set;
  142.         Set.next=&System;
  143.         System.next=mNULL;
  144.         makeReversChainTable(&Clock);
  145.         //------------------//
  146.         SetClock.next=&SetDate;
  147.         SetDate.next=&SetAlarm;
  148.         SetAlarm.next=&SetSystem;
  149.         SetSystem.next=mNULL;
  150.         makeReversChainTable(&SetClock);
  151.         //------------------//
  152.         SetSecond.next=&SetMinute;
  153.         SetMinute.next=&SetHour;
  154.         SetHour.next=mNULL;
  155.         makeReversChainTable(&SetSecond);
  156.         //------------------//
  157.         SetYear.next=&SetMonth;
  158.         SetMonth.next=&SetDay;
  159.         SetDay.next=&SetWeek;
  160.         SetWeek.next=mNULL;
  161.         makeReversChainTable(&SetYear);
  162.         //------------------//
  163.         SetAlarmSecond.next=&SetAlarmMinute;
  164.         SetAlarmMinute.next=&SetAlarmHour;
  165.         SetAlarmHour.next=mNULL;
  166.         makeReversChainTable(&SetAlarmSecond);
  167. //----子菜单父节点名以及父菜单光标位置----//
  168.         makeParentNode(&mainMenu,&Clock);
  169.         makeParentNode(&Set,&SetClock);
  170.         makeParentNode(&SetClock,&SetSecond);
  171.         makeParentNode(&SetDate,&SetYear);
  172.         makeParentNode(&SetAlarm,&SetAlarmSecond);
  173. }
  174. //-------------------------------------------//
  175. //函数名:菜单信息初始化函数
  176. //入口:Void
  177. //出口:Void
  178. //功能:配置菜单的初始化信息,必须设置仔细否
  179. //                则将产生未知后果
  180. //-------------------------------------------//
  181. void menuInfoInit()
  182. {
  183. //----父菜单目录数以及子菜单目录序号----//
  184.         makeDirectoryNumber(&Clock);
  185.         makeDirectoryNumber(&SetClock);
  186.         makeDirectoryNumber(&SetSecond);
  187.         makeDirectoryNumber(&SetYear);
  188.         makeDirectoryNumber(&SetAlarmSecond);
  189. //----菜单名字----//
  190.         mainMenu.pMeunName=MeunName;
  191.         getMenuName(mainMenuSubdirectory,&Clock);
  192.         getMenuName(SetSubdirectory,&SetClock);
  193.         getMenuName(SetClockSubdirectory,&SetSecond);
  194.         getMenuName(SetDateSubdirectory,&SetYear);
  195.         getMenuName(SetAlarmSubdirectory,&SetAlarmSecond);
  196. //----功能函数----//
  197.         System.pFunction=aboutSystem;
  198.         Clock.pFunction=displayClock;
  199.         Calendar.pFunction=displayDate;
  200. }
  201. //-------------------------------------------//
  202. //函数名:时间显示函数
  203. //入口:Void
  204. //出口:Void
  205. //功能:显示时间
  206. //-------------------------------------------//
  207. void displayClock()
  208. {
  209.         struct tm * tmptr;
  210.         int hour1,min1,second1;
  211.         time_t secnow;
  212.         time(&secnow);
  213.         tmptr = localtime(&secnow);        
  214.         hour1 = tmptr->tm_hour;
  215.         min1 = tmptr->tm_min;
  216.         second1=tmptr->tm_sec;
  217.         printf("┌───>>时钟显示<<───┐\n");
  218.         printf("│北京时间:%.2d:%.2d:%.2d      │\n",hour1,min1,second1);
  219.         printf("└────────────┘\n");
  220. }
  221. //-------------------------------------------//
  222. //函数名:日期显示函数
  223. //入口:Void
  224. //出口:Void
  225. //功能:显示日期
  226. //-------------------------------------------//
  227. void displayDate()
  228. {
  229.         char p[7][4]={"日","一","二","三","四","五","六"};
  230.         struct tm * tmptr;
  231.         int year,month,day,week;
  232.         time_t secnow;
  233.         time(&secnow);
  234.         tmptr = localtime(&secnow);        
  235.         year = tmptr->tm_year;
  236.         month = tmptr->tm_mon;
  237.         day=tmptr->tm_mday;
  238.         week=tmptr->tm_wday;
  239.         printf("┌───>>日期显示<<───┐\n");
  240.         printf("│%d年%d月%d日 星期%s    │\n",year+1900,month+1,day,p[week]);
  241.         printf("└────────────┘\n");
  242. }
  243. //-------------------------------------------//
  244. //函数名:系统信息显示函数
  245. //入口:Void
  246. //出口:Void
  247. //功能:显示系统信息
  248. //-------------------------------------------//
  249. void aboutSystem()
  250. {
  251.         printf("┌───>>关于系统<<───┐\n");
  252.         printf("│名称:多级菜单系统      │\n");
  253.         printf("│作者:詹磊(沐雨迎风)  │\n");
  254.         printf("│版本:V1.0              │\n");
  255.         printf("│说明:‘↑’->光标上移  │\n");
  256.         printf("│      ‘←’->返回      │\n");
  257.         printf("│      ‘→’->进入      │\n");
  258.         printf("│      ‘↓’->光标下移  │\n");
  259.         printf("└────────────┘\n");
  260. }
  261. //-------------------------------------------//
  262. //函数名:菜单显示函数
  263. //入口:MenuInfo *pM:需要显示的菜单结构体地址
  264. //出口:UINT8                :0
  265. //功能:显示菜单,包括目录、菜单名、光标、光标位置
  266. //-------------------------------------------//
  267. UINT8 menuDisplay(MenuInfo *pM)
  268. #define MaxDisplayNumber        5
  269. {
  270.         MenuInfo *tempM=pM->meunStatus;
  271.         UINT8 i=0;
  272.         if(tempM->serialNumber>MaxDisplayNumber)
  273.         {
  274.                 while(i<(MaxDisplayNumber-1))
  275.                 {
  276.                         i++;
  277.                         tempM=tempM->last;
  278.                 }               
  279.         }
  280.         else
  281.         {
  282.                 while(tempM->last!=mNULL)
  283.                 {
  284.                         tempM=tempM->last;
  285.                 }
  286.         }
  287.         i=0;
  288.         printf("┌─>>多级菜单系统V1.0<<─┐\n");
  289.         printf("  ---------%s---------\n %d/%d\n",pM->pMeunName,pM->meunStatus->serialNumber,pM->directoryNumber);
  290.         do
  291.         {
  292.                 if(tempM==pM->meunStatus)
  293.                         printf("  >>%s\n",tempM->pMeunName);
  294.                 else
  295.                         printf("    %s\n",tempM->pMeunName);
  296.                 if(tempM->next!=mNULL)
  297.                         tempM=tempM->next;
  298.                 i++;
  299.         }while(i<MaxDisplayNumber&&i<pM->directoryNumber);
  300.         while(i<MaxDisplayNumber)
  301.         {
  302.                 printf("\n");
  303.                 i++;
  304.         }
  305.         printf("└────────────┘\n");
  306.         return 0;
  307. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:320397 发表于 2018-5-3 10:36 | 只看该作者
菜单太多看了头都痛,不过用学习和找借鉴是不错的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表