找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5391|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

VS 2010文本多級(jí)菜單程序系統(tǒng)設(shè)計(jì),理論可實(shí)現(xiàn)1~255個(gè)菜單級(jí)數(shù)和目錄數(shù)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
基于VS 2010的文本菜單系統(tǒng),理論上最大可以實(shí)現(xiàn)1~255個(gè)菜單級(jí)數(shù)和目錄數(shù)

全部源碼下載(整個(gè)工程文件):
menu-systemV1.0.rar (1002.01 KB, 下載次數(shù): 31)



部分源程序預(yù)覽:
  1. //---------------------------------------------------//
  2. //產(chǎn)品:多級(jí)菜單程序
  3. //作者:詹磊
  4. //版本:v1.0
  5. //說明:本程序僅供測試使用,在創(chuàng)建鏈表時(shí)出現(xiàn)錯(cuò)誤將產(chǎn)生未知后果
  6. //修改歷史:1、7/30                創(chuàng)建
  7. //                        2、7/31                添加自動(dòng)計(jì)算菜單目錄信息功能
  8. //                        3、8/12                代碼整理
  9. //功能描述:理論上可以實(shí)現(xiàn)255級(jí)樹形單列文本菜;
  10. //                        單每個(gè)菜單最大目錄數(shù)為255個(gè);
  11. //                        通過定義MaxDisplayNumber來設(shè)置每面菜單顯示的目錄數(shù);
  12. //運(yùn)行環(huán)境:VC2010
  13. //---------------------------------------------------//
  14. #include "..\Include\menu.h"                /*菜單頭文件*/
  15. //--主菜單--//
  16. MenuInfo mainMenu;                                        //菜單結(jié)構(gòu)體
  17. char MeunName[]="主菜單";                        //菜單名字表
  18. //--一級(jí)菜單--//
  19. MenuInfo Clock,Calendar,Music,Radio,Games,Set,System;                                                                //菜單結(jié)構(gòu)體
  20. char *mainMenuSubdirectory[7]={"時(shí)鐘","日歷","音樂","收音","游戲","設(shè)置","系統(tǒng)"};        //菜單名字表
  21. //--二級(jí)菜單--//
  22. MenuInfo SetClock,SetDate,SetAlarm,SetSystem;                                                        //菜單結(jié)構(gòu)體
  23. char *SetSubdirectory[4]={"時(shí)間","日期","鬧鐘","系統(tǒng)"};        //菜單名字表
  24. //--三級(jí)菜單--//
  25. MenuInfo SetSecond,SetMinute,SetHour;                                        //菜單結(jié)構(gòu)體
  26. char *SetClockSubdirectory[3]={"秒","分","時(shí)"};                        //菜單名字表
  27. MenuInfo SetYear,SetMonth,SetDay,SetWeek;                                //菜單結(jié)構(gòu)體
  28. char *SetDateSubdirectory[4]={"年","月","日","星期"};        //菜單名字表
  29. MenuInfo SetAlarmSecond,SetAlarmMinute,SetAlarmHour;        //菜單結(jié)構(gòu)體
  30. char *SetAlarmSubdirectory[3]={"秒","分","時(shí)"};                        //菜單名字表
  31. //-------------------------------------------//
  32. //函數(shù)名:創(chuàng)建菜單反向鏈?zhǔn)奖砗瘮?shù)
  33. //入口:MenuInfo *pM:菜單子目錄的鏈?zhǔn)奖眍^
  34. //出口:Void
  35. //功能:*pM必須為鏈?zhǔn)奖眍^,否則會(huì)造成目錄缺項(xiàng)
  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. //函數(shù)名:創(chuàng)建菜單父節(jié)點(diǎn)函數(shù)
  58. //入口:MenuInfo *pParentM:父節(jié)點(diǎn)結(jié)構(gòu)體
  59. //                MenuInfo *pM:菜單子目錄的鏈?zhǔn)奖眍^
  60. //出口:Void
  61. //功能:*pM必須為鏈?zhǔn)奖眍^,否則會(huì)造成目錄缺項(xiàng)
  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. //函數(shù)名:創(chuàng)建菜單目錄信息函數(shù)
  80. //入口:MenuInfo *pM:菜單子目錄的鏈?zhǔn)奖眍^
  81. //出口:Void
  82. //功能:*pM必須為鏈?zhǔn)奖眍^,否則會(huì)造成未知后果
  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. //函數(shù)名:獲取菜單名字函數(shù)
  102. //入口:char **pChar:菜單名字所在的數(shù)組的指針
  103. //                MenuInfo *pM:菜單子目錄的鏈?zhǔn)奖眍^
  104. //出口:Void
  105. //功能:*pM必須為鏈?zhǔn)奖眍^,否則會(huì)造成未知后果
  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. //函數(shù)名:創(chuàng)建菜單鏈?zhǔn)奖砗瘮?shù)
  126. //入口:Void
  127. //出口:Void
  128. //功能:相同的父節(jié)點(diǎn)的結(jié)構(gòu)體組成一個(gè)鏈?zhǔn)奖?
  129. //                必須創(chuàng)建仔細(xì)否則將產(chǎn)生未知后果。
  130. //-------------------------------------------//
  131. void makeMenuList()
  132. {
  133. //----目錄鏈?zhǔn)奖?---//
  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. //----子菜單父節(jié)點(diǎn)名以及父菜單光標(biāo)位置----//
  168.         makeParentNode(&mainMenu,&Clock);
  169.         makeParentNode(&Set,&SetClock);
  170.         makeParentNode(&SetClock,&SetSecond);
  171.         makeParentNode(&SetDate,&SetYear);
  172.         makeParentNode(&SetAlarm,&SetAlarmSecond);
  173. }
  174. //-------------------------------------------//
  175. //函數(shù)名:菜單信息初始化函數(shù)
  176. //入口:Void
  177. //出口:Void
  178. //功能:配置菜單的初始化信息,必須設(shè)置仔細(xì)否
  179. //                則將產(chǎn)生未知后果
  180. //-------------------------------------------//
  181. void menuInfoInit()
  182. {
  183. //----父菜單目錄數(shù)以及子菜單目錄序號(hào)----//
  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. //----功能函數(shù)----//
  197.         System.pFunction=aboutSystem;
  198.         Clock.pFunction=displayClock;
  199.         Calendar.pFunction=displayDate;
  200. }
  201. //-------------------------------------------//
  202. //函數(shù)名:時(shí)間顯示函數(shù)
  203. //入口:Void
  204. //出口:Void
  205. //功能:顯示時(shí)間
  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("┌───>>時(shí)鐘顯示<<───┐\n");
  218.         printf("│北京時(shí)間:%.2d:%.2d:%.2d      │\n",hour1,min1,second1);
  219.         printf("└────────────┘\n");
  220. }
  221. //-------------------------------------------//
  222. //函數(shù)名:日期顯示函數(shù)
  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. //函數(shù)名:系統(tǒng)信息顯示函數(shù)
  245. //入口:Void
  246. //出口:Void
  247. //功能:顯示系統(tǒng)信息
  248. //-------------------------------------------//
  249. void aboutSystem()
  250. {
  251.         printf("┌───>>關(guān)于系統(tǒng)<<───┐\n");
  252.         printf("│名稱:多級(jí)菜單系統(tǒng)      │\n");
  253.         printf("│作者:詹磊(沐雨迎風(fēng))  │\n");
  254.         printf("│版本:V1.0              │\n");
  255.         printf("│說明:‘↑’->光標(biāo)上移  │\n");
  256.         printf("│      ‘←’->返回      │\n");
  257.         printf("│      ‘→’->進(jìn)入      │\n");
  258.         printf("│      ‘↓’->光標(biāo)下移  │\n");
  259.         printf("└────────────┘\n");
  260. }
  261. //-------------------------------------------//
  262. //函數(shù)名:菜單顯示函數(shù)
  263. //入口:MenuInfo *pM:需要顯示的菜單結(jié)構(gòu)體地址
  264. //出口:UINT8                :0
  265. //功能:顯示菜單,包括目錄、菜單名、光標(biāo)、光標(biāo)位置
  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("┌─>>多級(jí)菜單系統(tǒng)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. }
復(fù)制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:320397 發(fā)表于 2018-5-3 10:36 | 只看該作者
菜單太多看了頭都痛,不過用學(xué)習(xí)和找借鑒是不錯(cuò)的。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表