UNIX环境下非图形终端上的通用下拉弹出式菜单工具_第1页
UNIX环境下非图形终端上的通用下拉弹出式菜单工具_第2页
UNIX环境下非图形终端上的通用下拉弹出式菜单工具_第3页
UNIX环境下非图形终端上的通用下拉弹出式菜单工具_第4页
UNIX环境下非图形终端上的通用下拉弹出式菜单工具_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、UNIX环境下非图形终端上的通用下拉弹出式菜单工具    一、问题的提出随着计算机在社会生产、生活各部门的广泛应用和高档微机、小型机的不断出台,高性能UNIX/XENIX多用户、多任务操作系统正在逐步取代原有单用户的DOS系统。这就迫切需要在新环境下开发出大批功能齐全的应用软件工具,以取代DOS环境下的各种应用软件,从而满足用户新的要求。以往的菜单工具虽各有其特点,但均是在DOS环境下开发的,都借助于Windows或TurboC强大的图形处理库函数,有良好的开发环境,而且一般的做法是,为每一个菜单编制一特定的程序,即:用户菜单与程序具有一一对应的关系,一

2、旦菜单做出修改,对程序也必须做相应的改动,从而导致编程工作量大,重复劳动多,灵活性差等不足。能否在UNIX操作系统下的中西文终端上,脱离TurboC强大的函数库,开发出一个独立于用户菜单,对不同内容与结构的若干个用户菜单实现管理的应用程序呢?二、问题分析与具体的用户菜单无关是该通用软件的主要特征。通用性要求:使程序相对于菜单而独立,必须通过某种方式将一个菜单的信息传递给程序,而不同的菜单其内容与功能选项,以及各功能选项所包含的子菜单嵌套层数(以下简称结构)都是不同的,这就要求程序必须能"动态"地处理用户菜单的内容与结构。1.动态处理菜单程序要想"动态"地

3、处理不同的用户菜单,则必须在程序中实现变量的"动态定义",以便将数目不定的各功能选项进行所需处理。C语言中变量定义的实质,是为了在编译时能为其分配相应的存储单元。同时,C语言又提供了指针机制,允许使用指针对内存单元进行操作。而且,C语言经编译后,取得并使用四个逻辑上不同、用于不同对象的内存区域,分别是:栈、堆、全局变量区、程序代码区,其中"堆"是一个自由内存区域,C语言可通过内存分配函数(malloc()、calloc(),动态地从中获得所需空间。由指针指向被分配的内存块,使之可作为变量空间使用。当该内存空间无用时,可利用内存释放函数free()释放指针

4、所指向的内存块。而数据结构中链表的特点是:逻辑上相邻的元素在物理上不一定相邻,数据元素之间的逻辑关系是由结点中的指针指示的,换句话说,指针为数据元素之间的逻辑关系的映像。它是一种动态结构,链表所占用的空间不需预先分配,而是由系统应需求即时生成。2.用双向循环链表实现菜单功能下拉弹出式菜单系统系在顶端水平显示包含各主功能选项的菜单条行,用户可以利用$-键或键移动并回车选择所需的主功能选项,而被选取的主功能选项将会显示其相关的子功能选项在下拉的弹出式菜单框中。同级菜单的功能选项形成一闭合循环,即:当用户利用(或)键移动高亮度反白亮条至同级功能选项的顶(或底)部时,再往上(或下)移动,则高亮度反白条

5、将自动返回底(或顶)部。子菜单可在该级任一功能选项上按"q"键返回其父菜单。为了实现这一功能,采用双向式循环链表作为该软件的基本数据结构。将一个窗口下的菜单(仅有一个)作为一相对独立的双向循环链表,即:同一级的菜单以各功能选项信息的结构体形式为结点,构造成双向循环链表。各菜单之间(即:相对独立的双向循环链表之间)又有父子关系,采用C语言的指针机制使各链表有机地连结成网。基于此,菜单便可"大"可"小",可"深"可"浅"("大":指菜单项目多,反之为"小"&q

6、uot;深":指子菜单嵌套层数多)。3.创建与控制屏幕窗口与许多操作系统只在汇编语言级向用户提供系统调用的接口不同,UNIX不仅在汇编语言级,而且在程序设计语言C中提供了这种接口。通过以上分析,笔者想到了一种应用内存分配(指针)和链表相结合来实现变量的动态定义,利用C语言的递归调用最终实现程序通用性的方法。现将该方法与程序提供出来供大家参考。三、具体方法1.先根据相应的text文件内容创建双向循环链表网;2.再用自定义函数menu()实现对该链表网的应用。详见程序清单和text文件示例。(1)下拉弹出式菜单程序清单(以W开头的有关窗口函数是CURSES提供的)# inclu

7、de <curses.h># include <string.h># include <stdio.h># define LEN sizeof(struct link)struct linkchar str50,subp20,prname20,subtitl30,mbegin,mend; int tlin,tcol,subhigh,subwide,sublin,subcol,lin,col; struct li

8、nk*next,*befo,*subm,*parem,*paret;WINDOW *pwin,*subwin;struct link *mhead; char tree40;main() /*主函数*/struct link *creat(); void menu();char fname10,tname30;int wi,hi,li,co,tlin,tcol;FILE *fp1;if (fp1=fopen("main.txt",&qu

9、ot;r")=NULL)  exit(0); fscanf(fp1,"%s %d %d %s %d %d %d %d %sn",fname,&tlin,&tcol,tname,&hi,&wi,&li,&co,tree);free(fp1); initscr(); cbreak();mhead=creat(fname,NULL,NULL);/*创建双向循环链表网*/menu(mhead,NU

10、LL,tlin,tcol,tname,hi,wi,li,co);/*操纵双向循环链表网*/endwin(); exit(0);/*操纵菜单函数*/void menu(head,parewin,tline,tcolu,titl,high,wide,line,colu)struct link *head; int high,wide,line,colu,tline,tcolu;char titl30; WINDOW *parewin;WINDOW *win,*pw; struct 

11、;link *p,*stout,*head1;int keycode;win=newwin(high,wide,line,colu); /*创建窗口*/keypad(win,TRUE); keycode=0; box(win,'*','*');mvwaddstr(win,tline,tcolu,titl); wrefresh(win);stout=head1=head; wrefresh(win);for (p=head1;p->mend!='T') 

12、/*菜单显示*/ p->pwin=parewin; p=p->next; p->pwin=parewin;dowrefresh(win); p=head1;for (;p->mend!='T')mvwaddstr(win,p->lin,p->col,p->str); p=p->next; mvwaddstr(win,p->lin,p->col,p->str);wrefresh(win);wstandout(win);mvwaddstr(win,

13、stout>lin,stout>col,stout>str);wrefresh(win);keycode=wgetch(win);switch(keycode) /*接收键值*/case KEY-UP:stout=stout>befo;wstandend(win);break;case KEY-DOWN:stout=stout>next;wstandend(win);break;case 1861:stout=stout>next;wstandend(win);break;case 1860:stout=st

14、out>befo;wstandend(win);break;case 10:if (strcmp(stout>prname,"exit")=0) wstandend(win); endwin(0);exit(0);elseif (strcmp(stout>prname,"null.exe")!=0) wstandend(win);system(stout>prname);wrefresh(curscr);break;if (stout>subm!=NULL

15、) /*递归调用*/wstandend(win);menu(stout>subm,win,stout>tlin,stout>tcol,stout>subtitl,stout>subhigh,stout>subwide,stout>sublin,stout>subcol);break;else wstandend(win); break; case 113 : /*"q"键返回父菜单*/if (stout>pwin!=NULL)wstanden

16、d(win); wclear(win); wrefresh(win); free(win);win=stout>pwin; touchwin(win); wrefresh(win); keypad(win,TRUE); head1=stout>parem;wstan dend(win); stout=stout>paret; break;else wstandend(win); break;  while (1);return;

17、/*创建链表函数*/struct link *creat(submenu,paremenu,pareitem)char submenu10; struct link *paremenu; struct link *pareitem;int n; struct link menu1; struct link *head; struct link *p1,*p2;FILE *fp; char

18、 subname60;strcpy(subname,NULL); strcpy(subname,tree); strcat(subname,submenu);if (fp=fopen(subname,"r")=NULL)  exit(0); head=NULL; n=1;for (;!feof(fp);)fscanf(fp,"%s %d %d %s %d %d %s %d %d %d&#

19、160;%d %sn",menu1.str,&menu1.lin,&menu1.col,menu1.subp,&menu1.tlin,&menu1.tcol,menu1.subtitl,&menu1.subhigh,&menu1.subwide,&menu1.sublin,&menu1.subcol,menu1.prname);if (n=1)p1=p2=(struct link *)malloc(LEN); head=p1; head>mbegin=&#

20、39;T' head>mend='F'strcpy(head>str,menu1.str); strcpy(head>subp,menu1.subp);strcpy(head>prname,menu1.prname); strcpy(head>subtitl,menu1.subtitl);head>lin=menu1.lin; head>col=menu1.col; head>tlin=menu1.tlin;head>tcol=menu1.tcol; hea

21、d>subhigh=menu1.subhigh;head>subwide=menu1.subwide; head>sublin=menu1.sublin;head>subcol=menu1.subcol; head>pwin=NULL; head>subwin=NULL;head>subm=NULL; head>parem=paremenu; head>paret=pareitem;if (strcmp(p1->subp,"null.txt") 

22、head>subm=creat(head>subp,head,p1);elsep1=(struct link *)malloc(LEN); p2->next=p1; p1->befo=p2;p1->mbegin='F' p1->mend='F' strcpy(p1->str,menu1.str);strcpy(p1->subp,menu1.subp); strcpy(p1->prname,menu1.prname);strcpy(p1-&g

23、t;subtitl,menu1.subtitl); p1->lin=menu1.lin;p1->col=menu1.col; p1->tlin=menu1.tlin; p1->tcol=menu1.tcol;p1->subhigh=menu1.subhigh; p1->subwide=menu1.subwide;p1->sublin=menu1.sublin; p1->subcol=menu1.subcol;p1->pwin=NULL; p1->subwin=NULL; p1->subm=NULL;p1->parem=paremenu; p1->paret=pareitem;if (strcmp(p1->subp,"null.txt") p1->subm=creat(p1->subp,head,p1);p2=p1; n=n+1;p2->next=head; p2->mbegin='F' p2->mend='T' he

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论