创建菜单

上传人:kms****20 文档编号:40987041 上传时间:2018-05-27 格式:DOC 页数:19 大小:51.50KB
返回 下载 相关 举报
创建菜单_第1页
第1页 / 共19页
创建菜单_第2页
第2页 / 共19页
创建菜单_第3页
第3页 / 共19页
创建菜单_第4页
第4页 / 共19页
创建菜单_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《创建菜单》由会员分享,可在线阅读,更多相关《创建菜单(19页珍藏版)》请在金锄头文库上搜索。

1、创建菜单创建菜单本程序需要借肋两个参数文件来实现: (1) 、对菜单中每一项参数进行说明的文件(menu.def),它格式如下所述: !所属菜单代号!项顺序号!菜单项名称!外挂程序名称!下级菜单代号! 说明: 1、如菜单代号为“0“,则表示此项属于主菜单; 2、如外挂程序名称为“0“,则表示此菜单项对应的过程在菜单程序内部或对应于一个子菜单; 3、如下级菜单代号为“0“,则表示此菜单项无下级子菜单; 4、项顺序号同时可作为菜单热键使用。 假如文件 menu.def 中有下面这一行: !0!3!格式化磁盘!format /dev/rfd0135ds18!0! 它表示主菜单的第三项为格式化磁盘,它

2、对应的执行过程为 format /dev/rfd0135ds18,本项无子菜单。 如果用户想把自己编的实现查询功能程序 XXX 挂到本程序主菜单第4 项上,则可在 menu.def 中增加下面这一行: !0!4!查询!XXX!0! (2) 、对各菜单参数进行说明文件(menu.conf),其格式如下所述:!菜单代号!上一级菜单代号!边框标志!菜单宽度!菜单行数!菜单列数!起始横坐标!起始纵坐标! 说明: 1、边框标志为“0“表示无框,为“1“表示有边框; 2、上级菜单代号为“-1“,表示无上级菜单; 3、如菜单代号为“0“,表示主菜单。 当用户对菜单显示样式不满意时,可通过调整此文件设计个性化

3、的界面。 二 编程实现 本程序文件为 menu.c,部分代码如下: #include #define ESC 27 #define ENT 13 #define REFRESH 12 #define MAX_M 10 /* 菜单最大层数 */ void initial(),nomlastpos(),revcurpos(),disponepage(),dispprevline(); void dispnextline(),domenu(),getmenuconf(),keycont(); void getitem(), get_m_conf(), get_m_item(),clearwin(),

4、execprog(); /* 标识每一菜单项的结构 */ struct menu short menu_code; /* 所属菜单代号 */ short item_order; /* 项顺序号 */ char item20; /* 菜单项名称 */ char prog80; /* 本项菜单执行程序 */ short submenu_code; /* 下一级菜单编号 */ struct menu *next; /* 指向上一项的指针 */ struct menu *prev; /* 指向下一项的指针 */ m_item,*head,*this,*new,*last,*scrpos,*lastsc

5、rpos,*begin,*lastbegin,*lastscrMAX_M; /* 标识每一菜单内容的结构 */ struct menuconf short menu_code; /* 菜单代号 */ short last_code; /* 上一级菜单代号 */ short bord_flag; /* 边框标志 0-无边框 1-有边框 */ short m_wight; /* 菜单显示宽度 */ short m_lengh; /* 每一行项数 */ short m_col; /* 菜单列数 */ short m_bx; /* 菜单起始横坐标 */ short m_by; /* 菜单起始纵坐标 *

6、/ m_conf; WINDOW *menuwin, *boxwin, *curw, *lastwMAX_M, *workwin; long curpos, lastcurpos, lastscrcurpos, lastmenucurMAX_M; short menu_no = 0, wno = 0; /* 主函数 */ main() initial(); getmenuconf(0); /* 取第 0 号菜单参数 */ /* 创建主窗口 */ menuwin=newwin(m_conf.m_lengh, m_conf.m_wight, m_conf.m_bx+1, m_conf.m_by+1

7、); curw=menuwin; lastwwno=menuwin; getitem(); /* 取当前菜单各项内容 */ domenu(head, 0); endwin(); /* 取菜单各项参数函数 */ void getitem() FILE *fp; char buff0x100; /* 建边框窗口 */ boxwin=newwin(m_conf.m_lengh+2,m_conf.m_wight+2,m_conf.m_bx,m_conf.m_by); keypad(curw, TRUE); if (m_conf.bord_flag=1) box(boxwin, 0,0 ); wrefr

8、esh(boxwin); head=NULL; if (fp = fopen(“./menu.def“,“r“) = NULL) fprintf(stderr, “n 不能打开菜单定义文件n“); return; while( fgets(buff, 0x100, fp)!=NULL) get_m_item(buff); if (m_item.menu_code != menu_no) continue; new=(struct menu*)malloc(sizeof(struct menu); if (head = NULL) last = head; head = new; else th

9、is-next = new; last = this; this = new; this-menu_code=m_item.menu_code; this-item_order=m_item.item_order; strcpy(this-item,m_item.item); strcpy(this-prog,m_item.prog); this-submenu_code=m_item.submenu_code; this-next=NULL; this-prev = last; fclose(fp); /* 菜单处理函数 */ void domenu(curscrp, curp) struc

10、t menu *curscrp; int curp; int i, x, y; struct menu *mpos; this = head; disponepage(this); curpos = curp; scrpos = curscrp; lastcurpos = lastscrcurpos = 0; revcurpos(); for(;) switch (wgetch(curw) case ENT: /* 有下一级菜单 */ if (!strcmp(scrpos-prog, “0“) getmenuconf(scrpos-submenu_code); menu_no = scrpos

11、-submenu_code; wno+; lastmenucurwno=curpos; lastscrwno = scrpos; lastwwno=curw; workwin=newwin(m_conf.m_lengh,m_conf.m_wight,m_conf.m_bx+1,m_conf.m_by+1); curw=workwin; getitem(); domenu(head, 0); /* 是内部函数 */ /* 是外部可执行程序 */ else endwin(); execprog(); break; case ESC: case q: case Q: case 0: /* 无上级菜单

12、 */ if (m_conf.last_code = -1) clearwin(); endwin(); exit(0); /* 有上级菜单 */ else menu_no = m_conf.last_code; clearwin(); getmenuconf(menu_no); getitem(); touchwin(lastwwno); curw=lastwwno; curpos = lastmenucurwno; scrpos = lastscrwno; wno-; wrefresh(curw); break; case r: case R: case REFRESH: /* 重显屏幕

13、*/ wrefresh(curscr); break; case KEY_RIGHT: /* 右光标键 */ if ( scrpos-next != NULL ) lastcurpos = curpos; lastscrpos = scrpos;scrpos=scrpos-next; getyx(curw, x, y); if(x=m_conf.m_lengh-1) lastcurpos = curpos - 1; /* 实现向上卷屏 */ wmove(curw, 0, 0); wdeleteln(curw); dispnextline(“R“); else curpos+; if (curp

14、os%m_conf.m_col = 0) break; else nomlastpos(); revcurpos(); break; case KEY_LEFT: /* 左光标键 */ if ( scrpos-prev != NULL ) lastcurpos = curpos; lastscrpos = scrpos; scrpos=scrpos-prev; getyx(curw, x, y); if (x=0) lastcurpos = curpos + 1; /* 实现向下卷屏 */ winsertln(curw); dispprevline(“L“); else curpos-; if (curpos%m_conf.m_col=m_conf.m_col-1) break; else nomlastpos(); revcurpos(); break; case KEY_UP: /* 上光标键 */ lastcurpos = curpos; lastscrpos = scrpos; mpos = scrpos; for(i=0; i/td if ( mpos-prev != NULL ) mpos=mpos-prev; e

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号