📄 f_mainmenu.c
字号:
#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 + -