完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在公司闲着,于是写了一个菜单系统。这个菜单系统不是很复杂的,功能简单。总共300多行代码。实现1~255级和1~255相目录显示。
这里放在VS上实现,主要是便于调试,其实它主要用于带普通点阵液晶的系统。比如数字万年历。 当然了,毕竟是个系统级别的,还是比较耗内存的,所以当菜单级数很大,子目录很多,那么占用内存也相当多的。 本例程里实现3级菜单显示。 对于添加和删除子目录,只要修改一小部分代码即可。 //---------------------------------------------------// //产品:多级菜单程序 //作者:詹磊 //版本:v1.0 //说明:本程序仅供测试使用,在创建链表时出现错误将产生未知后果 //修改历史:1、2013/7/30 创建 // 2、2013/7/31 添加自动计算菜单目录信息功能 //功能描述:理论上可以实现255级树形单列文本菜; // 单每个菜单最大目录数为255个; // 通过定义MaxDisplayNumber来设置每面菜单显示的目录数; //运行环境:VC2010 //---------------------------------------------------// #include "stdafx.h" #include "Menu.h" #include #include <time.h> #include //----编译器无关数据类型定义----// #define UINT8 unsigned char #define UINT16 unsigned int //-------------------------------------------// //函数名:创建菜单链式表函数 //入口:Void //出口:Void //功能:相同的父节点的结构体组成一个链式表; // 必须创建仔细否则将产生未知后果。 //-------------------------------------------// void makeMenuList() { //----目录链式表----// mainMenu.next=NULL; mainMenu.last=NULL; //------------------// Clock.next=&Calendar; Calendar.next=&Music; Music.next=&Radio; Radio.next=&Games; Games.next=&Set; Set.next=&System; System.next=NULL; makeReversChainTable(&Clock); //------------------// SetClock.next=&SetDate; SetDate.next=&SetAlarm; SetAlarm.next=&SetSystem; SetSystem.next=NULL; makeReversChainTable(&SetClock); //------------------// SetSecond.next=&SetMinute; SetMinute.next=&SetHour; SetHour.next=NULL; makeReversChainTable(&SetSecond); //------------------// SetYear.next=&SetMonth; SetMonth.next=&SetDay; SetDay.next=&SetWeek; SetWeek.next=NULL; makeReversChainTable(&SetYear); //------------------// SetAlarmSecond.next=&SetAlarmMinute; SetAlarmMinute.next=&SetAlarmHour; SetAlarmHour.next=NULL; makeReversChainTable(&SetAlarmSecond); //----子菜单父节点名以及父菜单光标位置----// makeParentNode(&mainMenu,&Clock); makeParentNode(&Set,&SetClock); makeParentNode(&SetClock,&SetSecond); makeParentNode(&SetDate,&SetYear); makeParentNode(&SetAlarm,&SetAlarmSecond); } //-------------------------------------------// //函数名:菜单信息初始化函数 //入口:Void //出口:Void //功能:配置菜单的初始化信息,必须设置仔细否 // 则将产生未知后果 //-------------------------------------------// void menuInfoInit() { //----父菜单目录数以及子菜单目录序号----// makeDirectoryNumber(&Clock); makeDirectoryNumber(&SetClock); makeDirectoryNumber(&SetSecond); makeDirectoryNumber(&SetYear); makeDirectoryNumber(&SetAlarmSecond); //----菜单名字----// mainMenu.pMeunName=MeunName; getMenuName(mainMenuSubdirectory,&Clock); getMenuName(SetSubdirectory,&SetClock); getMenuName(SetClockSubdirectory,&SetSecond); getMenuName(SetDateSubdirectory,&SetYear); getMenuName(SetAlarmSubdirectory,&SetAlarmSecond); //----功能函数----// System.pFunction=aboutSystem; Clock.pFunction=displayClock; Calendar.pFunction=displayDate; } //-------------------------------------------// //函数名:时间显示函数 //入口:Void //出口:Void //功能:显示时间 //-------------------------------------------// void displayClock() { struct tm * tmptr; int hour1,min1,second1; time_t secnow; time(&secnow); tmptr = localtime(&secnow); hour1 = tmptr->tm_hour; min1 = tmptr->tm_min; second1=tmptr->tm_sec; printf("┌───>>时钟显示<<───┐n"); printf("│北京时间:%.2d:%.2d:%.2d │n",hour1,min1,second1); printf("└────────────┘n"); } //-------------------------------------------// //函数名:日期显示函数 //入口:Void //出口:Void //功能:显示日期 //-------------------------------------------// void displayDate() { char p[7][4]={"日","一","二","三","四","五","六"}; struct tm * tmptr; int year,month,day,week; time_t secnow; time(&secnow); tmptr = localtime(&secnow); year = tmptr->tm_year; month = tmptr->tm_mon; day=tmptr->tm_mday; week=tmptr->tm_wday; printf("┌───>>日期显示<<───┐n"); printf("│%d年%d月%d日 星期%s │n",year+1900,month+1,day,p[week]); printf("└────────────┘n"); } //-------------------------------------------// //函数名:系统信息显示函数 //入口:Void //出口:Void //功能:显示系统信息 //-------------------------------------------// void aboutSystem() { printf("┌───>>关于系统<<───┐n"); printf("│名称:多级菜单系统 │n"); printf("│作者:詹磊(沐雨迎风) │n"); printf("│版本:V1.0 │n"); printf("│说明:‘↑’->光标上移 │n"); printf("│ ‘←’->返回 │n"); printf("│ ‘→’->进入 │n"); printf("│ ‘↓’->光标下移 │n"); printf("└────────────┘n"); } //-------------------------------------------// //函数名:菜单显示函数 //入口:MenuInfo *pM:需要显示的菜单结构体地址 //出口:UINT8 :0 //功能:显示菜单,包括目录、菜单名、光标、光标位置 //-------------------------------------------// UINT8 menuDisplay(MenuInfo *pM) #define MaxDisplayNumber 5 { MenuInfo *tempM=pM->meunStatus; UINT8 i=0; if(tempM->serialNumber>MaxDisplayNumber) { while(i<(MaxDisplayNumber-1)) { i++; tempM=tempM->last; } } else { while(tempM->last!=NULL) { tempM=tempM->last; } } i=0; printf("┌─>>多级菜单系统V1.0<<─┐n"); printf(" ---------%s---------n %d/%dn",pM->pMeunName,pM->meunStatus->serialNumber,pM->directoryNumber); do { if(tempM==pM->meunStatus) printf(" >>%sn",tempM->pMeunName); else printf(" %sn",tempM->pMeunName); if(tempM->next!=NULL) tempM=tempM->next; i++; }while(i while(i printf("n"); i++; } printf("└────────────┘n"); return 0; } //-------------------------------------------// //函数名:主函数 //入口:Void //出口:Void //功能: //-------------------------------------------// void main() { MenuInfo *thisMenu; int i=0; makeMenuList(); menuInfoInit(); thisMenu=&mainMenu; while(1) { if(thisMenu->meunStatus!=NULL)//如果菜单光标位置不为空 { menuDisplay(thisMenu); switch(getch()) { case 80:if(thisMenu->meunStatus->next!=NULL)thisMenu->meunStatus=thisMenu->meunStatus->next; else { while(thisMenu->meunStatus->last!=NULL) { thisMenu->meunStatus=thisMenu->meunStatus->last; } } break; case 72:if(thisMenu->meunStatus->last!=NULL)thisMenu->meunStatus=thisMenu->meunStatus->last; else { while(thisMenu->meunStatus->next!=NULL) { thisMenu->meunStatus=thisMenu->meunStatus->next; } } break; case 77:if(thisMenu->meunStatus!=NULL)thisMenu=thisMenu->meunStatus; break; case 75:if(thisMenu->parentMenus!=NULL)thisMenu=thisMenu->parentMenus; break; default: break; } system("cls"); } else//如果菜单光标位置为空,则说明是菜单末端,指针指向功能函数 { if(thisMenu->pFunction!=NULL) { (thisMenu->pFunction)(); } switch(getch()) { case 75:if(thisMenu->parentMenus!=NULL)thisMenu=thisMenu->parentMenus; break; default: break; } system("cls"); } /* i=getch(); printf("%dn",i); */ } } |
|
相关推荐
7 个讨论
|
|
1307 浏览 1 评论
691 浏览 0 评论
谁知道这个16脚的芯片是什么型号2-15脚输出的互补的450KHZ方波电流达到200MA
662 浏览 0 评论
657 浏览 0 评论
1288 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-30 00:56 , Processed in 0.989325 second(s), Total 77, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号