📄 f_mainmenu.c
字号:
{ itemnum=num; for(i=0;i<num;++i) { SubMenuItem[i]=(char*)malloc(20*sizeof(char*)); strcpy(SubMenuItem[i],headitem->item_name); headitem=headitem->next; } SubMenuItem[i]=(char*)0; MenuItem=(ITEM**)malloc(10*sizeof(ITEM*)); for(i=0;i<num+1;++i) MenuItem[i]=new_item(SubMenuItem[i],""); Menu=new_menu((ITEM**)MenuItem); menu_opts_off(Menu,O_NONCYCLIC); scale_menu(Menu,&rows,&cols); SubMenuWin=newwin(rows+2,cols+3,Global_MenuConf->begin_y,Global_MenuConf->begin_x); keypad(SubMenuWin,TRUE); box(SubMenuWin,0,0); set_current_item(Menu,MenuItem[current_id]); set_menu_mark(Menu," "); set_menu_win(Menu,SubMenuWin); set_menu_sub(Menu,derwin(SubMenuWin,rows,cols,1,1)); touchwin(SubMenuWin); refresh(); post_menu(Menu); wrefresh(SubMenuWin); return Menu; } else return NULL;}/*在子菜单menu上接受响应*/void ResponseToSelect(MENU* menu){ WINDOW* win; int done=FALSE,c; win=menu_win(menu); while(!done){ switch(menu_driver(menu,c=GetMenuRequest(win))){ case E_OK: break; case E_UNKNOWN_COMMAND: done=MyMenuDriver(menu,c); break; default: break; } }}int MyMenuDriver(MENU* menu,int c){ int i; switch(c){ case QUIT: return TRUE; break; case ERASEMENU://如果是ESC键,则清除窗口menu. //没有上级菜单 if(Global_MenuConf->prev_code==-1) { clear(); endwin(); } else { /*切换到上一级的菜单配置*/ ChangeToUp(); EraseMenu(menu); /*绘制主菜单,绘制后将第0项置为焦点项*/ menulevel--; menuarray[menulevel+1]=-1; if(menuno==0) { curselected=itemno; RedrawMenuWin(menuarray); ReceiveInput(MainWin,MenuName,menuarray[0]); } else { curselected=itemno; RedrawMenuWin(menuarray); ResponseToSelect(SubMenu); } } break; case ENTER://如果是ESC键,则清除窗口menu. /*判断该菜单项是否有子菜单*/ if(!strcmp(Global_ItemConf->exec_proc,"0")&&Global_ItemConf->submenu_code!=0) { ChangeToNext(); SubMenu=DrawSubMenu(Global_ItemConf,0); if(SubMenu==NULL) break; else { curselected=0; menulevel++; menuarray[menulevel]=0; menuarray[menulevel+1]=-1; ResponseToSelect(SubMenu); } } /*如果是执行函数或者过程*/ else { if(strcmp(Global_ItemConf->exec_proc,"ExitApp")==0) { ExitApp(); exit(0); } /*如果是解析xml页面*/ else if(strcmp(Global_ItemConf->exec_proc,"TranEngine")==0) { EraseMenu(SubMenu); TranEngine(Global_ItemConf->exec_param,FormWin); } } break; case MOVETOPREV: ChangeToUp(); menulevel--; EraseMenu(SubMenu); curselected=(itemno+itemnum-1)%itemnum; menuarray[menulevel]=curselected; menuarray[menulevel+1]=-1; Global_MenuConf=GetMenuByIndex(menuno); Global_ItemConf=GetMenuItemByIndex(menuno); Head_ItemConf=Global_ItemConf; MoveToSpecItem(curselected); RedrawMenuWin(menuarray); ReceiveInput(MainWin,MenuName,menuarray[0]); break; case MOVETONEXT: ChangeToUp(); menulevel--; EraseMenu(SubMenu); curselected=(itemno+1)%itemnum; menuarray[menulevel]=curselected; menuarray[menulevel+1]=-1; Global_MenuConf=GetMenuByIndex(menuno); Global_ItemConf=GetMenuItemByIndex(menuno); Head_ItemConf=Global_ItemConf; MoveToSpecItem(curselected); RedrawMenuWin(menuarray); ReceiveInput(MainWin,MenuName,menuarray[0]); break; } return FALSE;}/*主菜单上接受用户输入,MenuWin为接受输入的窗口,current_id为当前的选中的菜单项*/void ReceiveInput(WINDOW *MenuWin,char* MenuName[],int current_id){ int i; for(;;) { switch(wgetch(MenuWin)){ case KEY_RIGHT: case ' ': //将上一个菜单项正常显示 wstandend(MenuWin); mvwaddstr(MenuWin,0,((current_id)%itemnum)*10+2, \ MenuName[(current_id)%itemnum]); //将下一个菜单项高亮显示 wstandout(MenuWin); mvwaddstr(MenuWin,0,((current_id+1)%itemnum)*10+2, \ MenuName[(current_id+1)%itemnum]); wstandend(MenuWin); wmove(MenuWin,0,0); current_id=(current_id+1)%itemnum; curselected=current_id; menuarray[menulevel]=curselected; menuarray[menulevel+1]=-1; MoveToSpecItem(curselected); refresh(); wrefresh(MenuWin); break; case KEY_LEFT: wstandend(MenuWin); mvwaddstr(MenuWin,0,((current_id)%itemnum)*10+2, \ MenuName[(current_id)%itemnum]); //将下一个菜单项高亮显示 wstandout(MenuWin); mvwaddstr(MenuWin,0,((current_id+itemnum-1)%itemnum)*10+2, \ MenuName[(current_id+itemnum-1)%itemnum]); wstandend(MenuWin); wmove(MenuWin,0,0); current_id=(current_id+itemnum-1)%itemnum; curselected=current_id; menuarray[menulevel]=curselected; menuarray[menulevel+1]=-1; MoveToSpecItem(curselected); refresh(); wrefresh(MenuWin); break; /*如果是回车键,则弹出请求子菜单*/ /*查询current_id的菜单项是否有*/ case ENTER: /*判断该菜单项是否有子菜单*/ if(!strcmp(Global_ItemConf->exec_proc,"0")&&Global_ItemConf->submenu_code!=0) { /*获取submenu_code指定的下级菜单的配置结构*/ ChangeToNext(); SubMenu=DrawSubMenu(Head_ItemConf,0); if(SubMenu==NULL) break; else { curselected=0; menulevel++; menuarray[menulevel]=0; menuarray[menulevel+1]=-1; ResponseToSelect(SubMenu); break; } } else { if(strcmp(Global_ItemConf->exec_proc,"ExitApp")==0) { ExitApp(); exit(0); } else if(strcmp(Global_ItemConf->exec_proc,"TranEngine")==0) { EraseMenu(SubMenu); TranEngine(Global_ItemConf->exec_param,FormWin); } } } }}/*绘制主菜单,current_id为当前选中的菜单的索引*/WINDOW* DrawMainMenu(F_MENU_ITEM* headitem,int current_id){ WINDOW* MenuWin; int num,i; MenuWin = newwin(1,COLS,2,0); keypad(MenuWin,TRUE); noecho(); num=GetMenuItemNum(0);/*获取指定的菜单的项数*/ itemnum=num; if(num!=-1) { wstandend(MenuWin); for(i=0;i<num;i++) { MenuName[i]=(char*)malloc(20*sizeof(char*)); strcpy(MenuName[i],headitem->item_name); mvwaddstr(MenuWin,0,i*10+2,MenuName[i]); headitem=headitem->next; } //第一个菜单高亮显示,将第current_id个菜单项加亮显示 wstandout(MenuWin); mvwaddstr(MenuWin,0,((current_id)%num)*10+2,MenuName[(current_id)%num]); wstandend(MenuWin); wmove(MenuWin,0,0); refresh(); wrefresh(MenuWin); /*当主菜单上焦点为current_id时候接受用户输入*/ menulevel=0; } return MenuWin;}/*按照menuarray中数据重绘菜单*/void RedrawMenuWin(int MenuArray[]){ int i=0; menuno=0; menulevel=0; Global_ItemConf=GetMenuItemByIndex(0); Head_ItemConf=Global_ItemConf; MainWin=DrawMainMenu(Global_ItemConf,MenuArray[0]); MoveToSpecItem(MenuArray[i]); i++; while(MenuArray[i]!=-1) { ChangeToNext(); SubMenu=DrawSubMenu(Head_ItemConf,MenuArray[i]); MoveToSpecItem(MenuArray[i]); menulevel++; i++; }}main(){ ScreenInitial(); DrawBarWin("江苏省邮政储蓄中间业务平台"); DrawFormWin(); memset(menuarray,0x0,sizeof(menuarray)); /*赋值给全局菜单项变量*/ Global_ItemConf=GetMenuItemByIndex(0); Head_ItemConf=Global_ItemConf; menuno=0; /*绘制主菜单,绘制后将第0项置为焦点项*/ MainWin=DrawMainMenu(Global_ItemConf,0); ReceiveInput(MainWin,MenuName,0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -