中南大学 操作系统实验报告课程设计报告.doc
《中南大学 操作系统实验报告课程设计报告.doc》由会员分享,可在线阅读,更多相关《中南大学 操作系统实验报告课程设计报告.doc(48页珍藏版)》请在三一办公上搜索。
1、操作系统实验报告界面设计l 菜单菜单包括菜单栏,菜单,菜单项,一个菜单栏可以包括N个菜单,一个菜单可以包括菜单项。C语言设计菜单的思想是用双向链表,先保存绘图区的内容,再在上面画菜单。l 菜单结构图菜单栏菜单1菜单2菜单n.尾指针头指针当前指向菜单菜单项1菜单项2。菜单项n头指针其他菜单项结构类似结尾指针l 数据结构1. 菜单栏:typedef struct menubar_sint number,x,y,barheight,baritemwidth;/*number用来记录菜单项的数目,x,y用来记录菜单栏在屏幕上的位置,barheight用来控制菜单栏的高度,baritemwidth用来控
2、制每项菜单的宽度*/struct menu_s *mhead; /*指向第一个菜单*/struct menu_s *mtail; /*指向最后一个菜单*/struct menu_s *mpoint; /*当用户按下左右箭头时用来记录指向那个菜单,初始指向mhead*/void (* docommand)(); /*菜单时间的处理函数*/MenuBar;2. 菜单:typedef struct menu_sint number; /*菜单是菜单栏中的第几项*/int subwidth; /*菜单项的宽度*/int subcount; /*菜单项的数目*/char *content; /*菜单显示
3、的字符串/struct menu_s *next; /*指向下一个菜单,如果是结尾菜单,则为NULL*/struct menu_s *before; /*指向前一个菜单,如果是头菜单,则为NULL*/struct submenu_s *sub; /*指向当前激活的菜单项*/struct submenu_s *head; /*指向第一个菜单项*/struct submenu_s *tail; /*指向最后一个菜单项*/Menu;3. 菜单项:typedef struct submenu_sint number; /*菜单项是菜单中的第几项*/int isactive; /*是否激活*/char
4、*content; /*显示的字符串*/struct submenu_s *next; /*指向下一个菜单项*/struct submenu_s *before; /*指向前一个菜单项*/submenu;l 函数实现1. 菜单构造函数/*该函数的功能主要是根据指定的menutitle字符串,往菜单栏中添加一项菜单*/void addmenu(char *menutitle)if(Mb=NULL)/*如果Mb(全局MenuBar类型的变量)为NULL,说明没有初始化菜单栏,要初始化*/if(Mb=(MenuBar *)malloc(sizeof(MenuBar)=NULL)doerror(Sys
5、tem error);Mb-number=0; /*菜单栏中菜单数目为0*/Mb-mpoint=Mb-mhead=Mb-mtail=NULL;Mb-x=0;Mb-y=0; /*位置于屏幕上(0,0)*/Mb-barheight=18; /*菜单栏高度为18*/Mb-baritemwidth=100; /*每项菜单的宽度为100*/Mb-docommand=docommand; /*设置事件处理函数为docommand()*/if(Mb-mtail=NULL) /*如果Mb-mtail为NULL,说明要先构造Mb-mhead*/if(Mb-mhead=(Menu *)malloc(sizeof(
6、Menu)=NULL)doerror(System error);Mb-mhead-before=NULL;Mb-mtail=Mb-mhead;else if(Mb-mtail-next=(Menu *)malloc(sizeof(Menu)=NULL)doerror(System error);Mb-mtail-next-before=Mb-mtail;Mb-mtail=Mb-mtail-next;Mb-mtail-number=Mb-number; /*当前添加进去的菜单位置,下面有Mb-number的自加*/Mb-mtail-subwidth=0; /*菜单项的宽度为0*/Mb-mtai
7、l-subcount=0; /*菜单项数目为0/Mb-mtail-content=menutitle; /*把菜单的字符串指针指向menutitle*/Mb-mtail-next=NULL;Mb-mtail-sub=Mb-mtail-head=Mb-mtail-tail=NULL; /*把菜单项全部置NULL*/Mb-number+;/*菜单栏中number加1,表示加进去了一个菜单*/ 2. 菜单项构造函数/*该函数的功能是根据menu指定的字符串,往该菜单中添加以itemtitle为字符串的菜单项比如additem(“File”,”Open”)则执行向File菜单中添加一项itemtitl
8、e菜单项*/void additem(char *menu,char *itemtitle) Mb-mpoint=Mb-mhead; /*先把指针指向菜单头,这里借用Mb中的mpoint为了不用额外的变量*/ while(Mb-mpoint!=NULL) if(stricmp(Mb-mpoint-content,menu)=0) /*遍历menu链表,如果找到一项和menu指定字符串相等的,则记录下来,跳出,*/ break; Mb-mpoint=Mb-mpoint-next; if(Mb-mpoint-tail=NULL) /*如果tail为空,则说明没有构造头节点head*/ if(Mb-
9、mpoint-head=(submenu *)malloc(sizeof(submenu)=NULL) doerror(System error); Mb-mpoint-head-before=NULL; Mb-mpoint-sub=Mb-mpoint-tail=Mb-mpoint-head; else if(Mb-mpoint-tail-next=(submenu *)malloc(sizeof(submenu)=NULL) doerror(System error); Mb-mpoint-tail-next-before=Mb-mpoint-tail; Mb-mpoint-tail=Mb-
10、mpoint-tail-next; if(strlen(itemtitle)Mb-mpoint-subwidth) Mb-mpoint-subwidth=strlen(itemtitle); /*该语句主要计算一下刚加进来的菜单项的字符数,如果比菜单的宽度还要大,则把该宽度赋值给subwidth,主要是为了画菜单是宽度足够*/ Mb-mpoint-subcount+;/*菜单项数目加一*/ Mb-mpoint-tail-number=Mb-mpoint-subcount; Mb-mpoint-tail-isactive=0; Mb-mpoint-tail-content=itemtitle;
11、Mb-mpoint-tail-next=NULL; 3. 绘画菜单栏void drawmenu() Mb-mpoint=Mb-mhead; rectangle(0,0,getmaxx()-1,Mb-y+Mb-barheight);/*画一个方框*/ while(Mb-mpoint!=NULL)outtextxy(Mb-mpoint-number*Mb-baritemwidth+Mb-x+5,Mb-y+6,Mb-mpoint-content); /*在菜单栏中逐项画出菜单的内容*/Mb-mpoint=Mb-mpoint-next;4. 绘画当前激活的菜单void drawsubmenu()sub
12、menu *temp;int x; /*x记录当前画菜单的x位置*/x=Mb-mpoint-number*Mb-baritemwidth+Mb-x;temp=Mb-mpoint-head;copyimage(x,Mb-barheight+2,x+Mb-mpoint-subwidth*8+5,(Mb-mpoint-subcount+1)*Mb-barheight+3); /*保存绘画区的内容,copyimage为自写的函数*/setfillstyle(1,getbkcolor();bar(x,Mb-barheight+2,x+Mb-mpoint-subwidth*8+5,(Mb-mpoint-s
13、ubcount+1)*Mb-barheight+3); /*用背景色把绘画区覆盖一下*/rectangle(x,Mb-barheight+2,x+Mb-mpoint-subwidth*8+5,(Mb-mpoint-subcount+1)*Mb-barheight+3); /*画一个方框*/while(temp!=NULL)if(temp-isactive) /*如果是当前激活的菜单,则画一个红色方框背景*/setfillstyle(1,RED);bar(x+2,temp-number*Mb-barheight+4,x+Mb-mpoint-subwidth*8+3,(temp-number+1)
14、*Mb-barheight-1);outtextxy(x+5,temp-number*Mb-barheight+5,temp-content);temp=temp-next;4. 进入菜单/*根据menu指定的字符串,说明用户从哪项菜单进入菜单,如gotomenucur(”File”)说明用户激活了“File”菜单*/void gotomenucur(char *menu)Mb-mpoint=Mb-mhead;while(Mb-mpoint-next!=NULL)if(stricmp(Mb-mpoint-content,menu)=0)break;Mb-mpoint=Mb-mpoint-nex
15、t;Mb-mpoint-sub=Mb-mpoint-head;Mb-mpoint-sub-isactive=1;drawsubmenu();5. 菜单按键处理void menukey()int key;while(1)key=get_key();switch(key)case KEY_LEFT: /*说明用户按下了向左按键,Mb-mpoint应该向前移一项*/Mb-mpoint-sub-isactive=0;backimage(Mb-mpoint-number*Mb-baritemwidth+Mb-x,Mb-barheight+2);if(Mb-mpoint-before!=NULL) /*如
16、果当前已经是mhead了,应该指向mtail*/Mb-mpoint=Mb-mpoint-before;elseMb-mpoint=Mb-mtail;Mb-mpoint-sub=Mb-mpoint-head;Mb-mpoint-sub-isactive=1;drawsubmenu();/*重画菜单,跳出*/break;case KEY_RIGHT: /*说明用户按下了向右键,解释同KEY_LEFT*/Mb-mpoint-sub-isactive=0;backimage(Mb-mpoint-number*Mb-baritemwidth+Mb-x,Mb-barheight+2);if(Mb-mpoi
17、nt-next!=NULL)Mb-mpoint=Mb-mpoint-next;elseMb-mpoint=Mb-mhead;Mb-mpoint-sub=Mb-mpoint-head;Mb-mpoint-sub-isactive=1;drawsubmenu();break;case KEY_UP: /*说明用户按下了向上键,应把当前激活的菜单项向上移一项*/Mb-mpoint-sub-isactive=0;backimage(Mb-mpoint-number*Mb-baritemwidth+Mb-x,Mb-barheight+2);if(Mb-mpoint-sub-before!=NULL)Mb
18、-mpoint-sub=Mb-mpoint-sub-before;elseMb-mpoint-sub=Mb-mpoint-tail;Mb-mpoint-sub-isactive=1;drawsubmenu();break;case KEY_DOWN: /*说明用户按下了向下键,当前菜单项应向下移一项*/Mb-mpoint-sub-isactive=0;backimage(Mb-mpoint-number*Mb-baritemwidth+Mb-x,Mb-barheight+2);if(Mb-mpoint-sub-next!=NULL)Mb-mpoint-sub=Mb-mpoint-sub-nex
19、t;elseMb-mpoint-sub=Mb-mpoint-head;Mb-mpoint-sub-isactive=1;drawsubmenu();break;case ENTER: /*说明用户按下了回车键,调用Mb-docommand()*/Mb-mpoint-sub-isactive=0;backimage(Mb-mpoint-number*Mb-baritemwidth+Mb-x,Mb-barheight+2);Mb-docommand();return;case ESC: /*说明用户按下了退出键,把拷贝的屏幕区域放回,不作任何处理*/Mb-mpoint-sub-isactive=0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中南大学 操作系统实验报告课程设计报告 中南 大学 操作系统 实验 报告 课程设计
链接地址:https://www.31ppt.com/p-4193410.html