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

📄 f_mainmenu.c

📁 《unix/Linux下的Curses库开发指南》综合示例程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "f_menuhead.h"/******全局变量信息**********************************************************/char errmsg[1024]; //全局错误信息F_MENU_ITEM *Global_ItemConf,*Head_ItemConf;//全局的菜单项配置文件F_MENU *Global_MenuConf;//全局的菜单配置文件MENU* SubMenu;//全局的菜单WINDOW *FormWin,*BarWin,*MainWin;char *MenuName[MAXMENU];int curselected;//获取当前焦点的菜单项的索引号int itemnum;//当前菜单的菜单项的数目int premenuno,menuno;//当前的菜单的菜单号int itemno;//记录弹出下级菜单时候的上级菜单项号码int menulevel=0;//0为主菜单,1为次子菜单,2为第二节子菜单,依次类推int menuarray[MAX_LEVEL];//记录各层次上选中菜单的索引号以便恢复重画extern int my_driver();extern int GetFormRequest();/***************************************************************************/F_MENU *GetMenuByIndex();F_MENU_ITEM *GetMenuItemByIndex();void ChangeToNext();void ChangeToUp();void MoveToSpecItem();void FreeItem();WINDOW* DrawMainMenu();void ReceiveInput();void RedrawMenuWin();/**************************************************************************/void ExitApp(){    werase(FormWin);    wrefresh(FormWin);     delwin(FormWin);     werase(BarWin);    wrefresh(BarWin);     delwin(BarWin);     FreeItem(Global_ItemConf);     FreeItem(Head_ItemConf);     Global_MenuConf=NULL;    clear();    refresh();    endwin();}/*切换到下级菜单,同时修改配置*/void ChangeToNext(){    /*获取上级菜单号*/    menuno=Global_ItemConf->submenu_code;    /*获取上级菜单项配置*/    Global_ItemConf=GetMenuItemByIndex(menuno);    /*获取上级菜单配置*/    Global_MenuConf=GetMenuByIndex(menuno);    Head_ItemConf=Global_ItemConf;    itemnum=GetMenuItemNum(menuno);}/*切换到上级菜单,同时修改配置*/void ChangeToUp(){    /*获取弹出子菜单时候父菜单的选中索引*/    itemno=Global_MenuConf->prev_item_code;    /*获取上级菜单号*/    menuno=Global_MenuConf->prev_code;    /*上一级菜单的菜单项数目*/    itemnum=GetMenuItemNum(menuno);}void DrawFormWin(){    FormWin = newwin(21,COLS,3,0);    box(FormWin,0,0);    refresh();    wrefresh(FormWin);}void EraseMenu(MENU* menu){    WINDOW* MainMenuWin=menu_win(menu);    WINDOW* SubMenuWin =menu_sub(menu);    unpost_menu(menu);    refresh();    werase(MainMenuWin);    wrefresh(MainMenuWin);    delwin(MainMenuWin);    delwin(SubMenuWin);    if(menulevel<0) menulevel=0;    DrawFormWin();}/*在给定窗口内绘制水平直线,y为直线所在的行数*/void DrawHLine(WINDOW* win,int y,int beg_x,int end_x){    int i;    wmove(win,y,beg_x);    for(i=beg_x;i<end_x-1;i=i+2)	mvwaddstr(win,y,i,"─");}void DrawBarWin(char* title){    BarWin = newwin(1,COLS,0,0);    DrawHLine(stdscr,1,0,COLS);    mvwaddstr(BarWin,0,16,title);    mvwaddstr(BarWin,0,43,"作者:张中庆");    refresh();    wrefresh(BarWin);}/*curses库初始化*/void ScreenInitial(){    initscr();       cbreak();     nonl();     noecho();       intrflush(stdscr,FALSE);       keypad(stdscr,TRUE);       refresh();   }/*获取指定menu_num的菜单的配置,保存在F_MENU结构中*//*menustring为传递的菜单的配置行字符串*/F_MENU* GetMenuConfig(char* menustring){    int i=0;    F_MENU* menuconf;    menuconf=(F_MENU*)malloc(sizeof(F_MENU));    memset(menuconf,0x0,sizeof(F_MENU));    menuconf->menu_code=atoi(StrItemGetByDelimit(menustring,"|",&i));    menuconf->prev_code=atoi(StrItemGetByDelimit(menustring,"|",&i));    menuconf->line_num=atoi(StrItemGetByDelimit(menustring,"|",&i));    menuconf->begin_y=atoi(StrItemGetByDelimit(menustring,"|",&i));    menuconf->begin_x=atoi(StrItemGetByDelimit(menustring,"|",&i));    menuconf->prev_item_code=atoi(StrItemGetByDelimit(menustring,"|",&i));	    return menuconf;}F_MENU_ITEM* GetMenuItemConfig(char* menuitemstring){    int i=0;    F_MENU_ITEM* menuitemconf;    menuitemconf=(F_MENU_ITEM*)malloc(sizeof(F_MENU_ITEM));    memset(menuitemconf,0x0,sizeof(F_MENU_ITEM));    menuitemconf->menu_code=atoi(StrItemGetByDelimit(menuitemstring,"|",&i));    menuitemconf->item_code=atoi(StrItemGetByDelimit(menuitemstring,"|",&i));    strcpy(menuitemconf->item_name,StrItemGetByDelimit(menuitemstring,"|",&i));    strcpy(menuitemconf->exec_proc,StrItemGetByDelimit(menuitemstring,"|",&i));    strcpy(menuitemconf->exec_param,StrItemGetByDelimit(menuitemstring,"|",&i));    menuitemconf->submenu_code=atoi(StrItemGetByDelimit(menuitemstring,"|",&i));    return menuitemconf;}//根据索引获取给定的菜单项配置F_MENU* GetMenuByIndex(int index){    FILE *fp;       int i=0;    char menu_buff[0x100];       F_MENU* menuconf;      if ((fp = fopen("menu.conf", "r"))==NULL) {   	fprintf(stderr, "无法打开菜单配置文件menu.conf!");   	return;       }       while( fgets(menu_buff, 0x100, fp)!=NULL ) {   	if(LineIsWhich(menu_buff)==4)	{           menuconf=GetMenuConfig(menu_buff);	   if(menuconf->menu_code==index)		break;	}	i++;    }/*    if(i== fgetlinenum(fp)) {   	strcpy(errmsg,"无法找到该索引的菜单配置");			return NULL;    }*/    return menuconf;}/*获取指定的menuindex的菜单的所有菜单项*/F_MENU_ITEM* GetMenuItemByIndex(int menuindex){    FILE *fp;       F_MENU_ITEM *itemconf;    F_MENU_ITEM *headitem,*newitem,*thisitem,*lastitem;    char buff[0x100];        headitem=NULL;//当前的起始菜单项设置为空    if ((fp = fopen("./menu.def","r")) == NULL)     {   	strcpy(errmsg,"无法打开菜单定义文件menu.def");	return NULL;       }       while( fgets(buff, 0x100, fp)!=NULL) {   	itemconf=GetMenuItemConfig(buff);   	if(itemconf->menu_code != menuindex)               continue;     	newitem=itemconf;   	if(headitem== NULL)	{   	    lastitem = headitem; 	    headitem = newitem;   	}	else {   	    thisitem->next = newitem; 	    lastitem = thisitem;   	}	thisitem = newitem;   	thisitem->next=NULL;       }       fclose(fp);       return headitem;}/*获取指定的菜单index的菜单项数*/int GetMenuItemNum(int index){    F_MENU_ITEM* menuitem;    int num=0;    menuitem=GetMenuItemByIndex(index);    if(menuitem!=NULL)    {	while (menuitem!=NULL)	{	    num++;	    menuitem=menuitem->next;	}		return num;    }    else return -1;}void FreeItem(F_MENU_ITEM* headitem){    if(headitem!=NULL)    {	free(headitem);    	headitem=NULL;    }	}/*将全局配置文件修该为光标所在处菜单项的配置*/void MoveToSpecItem(int current_id){    while(Global_ItemConf->item_code!=current_id)    {	Global_ItemConf=Global_ItemConf->next;	   	if(Global_ItemConf==NULL)	    Global_ItemConf=Head_ItemConf;    }}int GetMenuRequest(WINDOW* menuwin){    int c=wgetch(menuwin);    switch(c){	case 0x1b:return ERASEMENU;	case 0x0e:	    return REQ_NEXT_ITEM;	case 0x10:	    return REQ_PREV_ITEM;	case KEY_HOME:return REQ_FIRST_ITEM;	case KEY_LL:return REQ_LAST_ITEM;	case KEY_LEFT:	    if(menulevel==1)//如果当前为一级子菜单	    	return MOVETOPREV;	    else		return REQ_PREV_ITEM;	case KEY_UP:	    curselected=(curselected+itemnum-1)%itemnum;	    menuarray[menulevel]=curselected;	    MoveToSpecItem(curselected);	    return REQ_UP_ITEM;	case KEY_RIGHT:	case ' ':	    if(menulevel==1)//如果当前为一级子菜单            	return MOVETONEXT;	    else		return REQ_NEXT_ITEM;        case KEY_DOWN:	    curselected=(curselected+1)%itemnum;	    menuarray[menulevel]=curselected;	    MoveToSpecItem(curselected);	    return REQ_DOWN_ITEM;        case 0x14:return REQ_TOGGLE_ITEM;    }    return c;}/*绘制子菜单,headitem是需要绘制的菜单的菜单项的头指针*//*current_id为绘制后选中项*/MENU* DrawSubMenu(F_MENU_ITEM *headitem,int current_id){    char *SubMenuItem[10];//最大的菜单项    int num,i;    ITEM** MenuItem;    MENU* Menu;    WINDOW *MenuWin,*SubMenuWin;//菜单窗口    char c;    int rows,cols;    num=GetMenuItemNum(Global_ItemConf->menu_code);    if(num!=-1)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -