⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 f_mainmenu.c

📁 《unix/Linux下的Curses库开发指南》综合示例程序
💻 C
📖 第 1 页 / 共 2 页
字号:
    {	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 + -