📄 usermenu.c
字号:
#include <curses.h>#include <panel.h>#include <menu.h>#include <stdlib.h>#include "key.h"#include "public.h"#include "screen.h"#include "usermenu.h"void ProcessMenu( char *buf)//根据需要写此函数{ WINDOW *win; PANEL *panel; win = newwin(22,76,1,12); panel = new_panel(win);//一定要建立新屏幕,否则返回会隐藏原显示内容 Dialog(win, buf); move(24,40); getch(); del_panel(panel); delwin(win);} void FreeItem(ITEM **items){ while(*items) free_item(*items++);}void DeleteSubMenu(MENU *menu) { ITEM** items = menu_items(menu); WINDOW* win = menu_win(menu); WINDOW* sub = menu_sub(menu); unpost_menu(menu); werase(win); wrefresh(win); delwin(sub); delwin(win); FreeItem(items);} int CreateSubMenu(char *fname, int menuno)//0-成功 !0-失败{ int cnt=0, rows, cols, disprows, fmt; int c, beg_y, beg_x, maxitem = 0, curno; char buf[160], tmp[160]; ITEM **items; ITEM_RECORD *record; MENU *menu; FILE *fp; WINDOW *win; PANEL *panel; maxitem = 0; if((fp = fopen(fname,"r")) == NULL) { fprintf(stderr,"%s|%d|读菜单文件[%s]失败!\n",__FILE__,__LINE__,fname); return(-1); } while((fscanf(fp, "%[^\n]\n", buf) != EOF) && (maxitem == 0 || cnt < maxitem)) { switch(buf[0]) { case 'M': memset(tmp, 0, sizeof(tmp)); GetString(tmp, buf, 2, '|'); curno = atoi(tmp); if(curno == menuno) { memset(tmp, 0, sizeof(tmp)); GetString(tmp, buf, 3, '|'); beg_y = atoi(tmp); memset(tmp, 0, sizeof(tmp)); GetString(tmp, buf, 4, '|'); beg_x = atoi(tmp); memset(tmp, 0, sizeof(tmp)); GetString(tmp, buf, 5, '|'); maxitem = atoi(tmp); memset(tmp, 0, sizeof(tmp)); GetString(tmp, buf, 6, '|'); disprows = atoi(tmp); memset(tmp, 0, sizeof(tmp)); GetString(tmp, buf, 7, '|'); fmt = atoi(tmp); items = (ITEM **)calloc(maxitem + 1,sizeof(ITEM)); record = (ITEM_RECORD *)calloc(maxitem + 1,sizeof(ITEM_RECORD)); } break; case 'S': memset(tmp, 0, sizeof(tmp)); GetString(tmp, buf, 2, '|'); curno = atoi(tmp); if(curno == menuno) { GetString(record[cnt].name, buf, 3, '|'); memset(tmp, 0, sizeof(tmp)); GetString(tmp, buf, 4, '|'); record[cnt].subno = atoi(tmp); GetString(record[cnt].cmd, buf, 5, '|'); items[cnt] = new_item(record[cnt].name,NULL); cnt++; } break; default: break; } } items[cnt] = (ITEM *) NULL; fclose(fp); if(!(menu = new_menu((ITEM **) items))){ //建立菜单项 fprintf(stderr,"%s|%d|建立菜单项失败!",__FILE__,__LINE__); return(-1); } if(fmt == 1) { //行主格式 disprows = (COLS - 2 * beg_x - 5) / (menu->itemlen + 1); set_menu_format(menu, 1, disprows); } else { //列主格式 if(item_count(menu) < disprows) disprows = item_count(menu); set_menu_format(menu, disprows, 1); } scale_menu(menu, &rows, &cols); if(fmt == 1) cols = COLS - 2 * beg_x - 5;//行主格式画满 menu_opts_off(menu,O_SHOWDESC); if(win = newwin(rows + 2, cols + 5, beg_y, beg_x)) {//建立新窗口 if((panel = new_panel(win)) == NULL) { //窗口与屏面关联 fprintf(stderr,"%s|%d|建立窗口屏幕失败!",__FILE__,__LINE__); return(-1); } keypad(win, TRUE); NewBox(win); set_menu_win(menu, win);//菜单与窗口关联 set_menu_sub(menu, derwin(win, rows, cols, 1, 2));//画菜单子项 } else { fprintf(stderr,"%s|%d|建立菜单窗口失败!",__FILE__,__LINE__); return(-1); } if(post_menu(menu) != E_OK ) { //显示菜单 fprintf(stderr,"%s|%d|显示菜单失败!",__FILE__,__LINE__); return(-1); } else { update_panels();//更新屏幕 doupdate();//刷新 } while(c = wgetch(win)) switch(c) { case KEY_DOWN: menu_driver(menu, REQ_DOWN_ITEM); break; case KEY_UP: menu_driver(menu, REQ_UP_ITEM); break; case KEY_LEFT: menu_driver(menu, REQ_LEFT_ITEM); break; case KEY_RIGHT: menu_driver(menu, REQ_RIGHT_ITEM); break; case ENTER: if(curno = record[item_index(current_item(menu))].subno) CreateSubMenu(fname,curno); else { ProcessMenu(record[item_index(current_item(menu))].cmd); pos_menu_cursor(menu);//光标复位 update_panels(); doupdate(); } break; case ESCAPE: DeleteSubMenu(menu); del_panel(panel); free(record); update_panels(); doupdate(); return(0); break; default: //menu_driver(menu,c); break; } return(0);}int CreateMenu(char *fname){ return(CreateSubMenu(fname, 0));}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -