📄 mymenu.c
字号:
#include <curses.h>#include <panel.h>#include <menu.h>#include <stdlib.h>#include "public.h"#include "screen.h"#include "mymenu.h"#include "newtype.h"MENU_NODE *hMenu, *eMenu; extern int MenuFunc(char *code); void FreeItem(ITEM **items){ while(*items) free_item(*items++);}void DelSubMenu() { MENU_NODE *pMenu; MENU *menu = eMenu->menu; ITEM** items = menu_items(menu); WINDOW* win = menu_win(menu); WINDOW* sub = menu_sub(menu); PANEL *panel = eMenu->panel; ITEM_RECORD *record = eMenu->record; unpost_menu(menu); werase(win); wrefresh(win); delwin(sub); delwin(win); FreeItem(items); del_panel(panel); free(record); for(pMenu = hMenu; pMenu->next != eMenu; pMenu = pMenu->next); pMenu->next = NULL; free(eMenu); eMenu=pMenu;}void DelNextMenu(){ do { DelSubMenu(); }while(eMenu != hMenu->next);}int AddSubMenu(char *fname, int menuno)//0-成功 !0-失败{ MENU_NODE *pMenu; int cnt=0, rows, cols, disprows, fmt; int c, beg_y, beg_x, maxitem = 0; char buf[160], tmp[160]; ITEM **items; ITEM_RECORD *record; MENU *menu; FILE *fp; WINDOW *win; PANEL *panel; if((fp = fopen(fname,"r")) == NULL) { fprintf(stderr,"%s|%d|读菜单文件[%s]失败!\n",__FILE__,__LINE__,fname); return(-1); } while((fscanf(fp, "%[^\n]\n", buf) != EOF)) { switch(buf[0]) { case 'M': memset(tmp, 0, sizeof(tmp)); GetString(tmp, buf, 2, '|'); if(menuno == atoi(tmp)) { 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, '|'); if(menuno == atoi(tmp) && cnt < maxitem) { memset(tmp, 0, sizeof(tmp)); 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++; } } } items[cnt] = (ITEM *) NULL; fclose(fp); if(!(menu = new_menu(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 - 4;//行主格式画满 menu_opts_off(menu,O_SHOWDESC); if(win = newwin(rows + 2, cols + 4, beg_y, beg_x)) { //建立新窗口 if((panel = new_panel(win)) == NULL) { //窗口与屏面关联 fprintf(stderr,"%s|%d|建立窗口屏幕失败!",__FILE__,__LINE__); return(-1); } keypad(win, TRUE); set_menu_win(menu, win);//菜单与窗口关联 set_menu_sub(menu, derwin(win, rows, cols, 1, 2));//画菜单子项 } else { fprintf(stderr,"%s|%d|建立菜单窗口失败!",__FILE__,__LINE__); return(-1); } box(win, 0, 0); if(post_menu(menu) != E_OK ) { //显示菜单 fprintf(stderr,"%s|%d|显示菜单失败!",__FILE__,__LINE__); return(-1); } else { update_panels();//更新屏幕 doupdate();//刷新 } pMenu = (MENU_NODE * ) malloc(sizeof(MENU_NODE)); pMenu->record = record; pMenu->menuno = menuno; pMenu->menu = menu; pMenu->panel = panel; pMenu->next = NULL; eMenu->next = pMenu; eMenu = pMenu;}int MenuIndex(MENU *menu){ return(item_index(current_item(menu)));}void MenuDriver(char *fname){ int c, curno; MENU *menu = eMenu->menu; WINDOW *win = menu_win(menu); 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: if(eMenu->menuno == 0 ) menu_driver(menu, REQ_LEFT_ITEM); else if(curno = eMenu->record[MenuIndex(menu)].subno) { AddSubMenu(fname,curno); return; } else { DelNextMenu(); menu_driver(hMenu->next->menu, REQ_LEFT_ITEM); update_panels(); doupdate(); return; } break; case KEY_RIGHT: if(eMenu->menuno == 0 ) menu_driver(menu, REQ_RIGHT_ITEM); else { DelNextMenu(); menu_driver(hMenu->next->menu, REQ_RIGHT_ITEM); update_panels(); doupdate(); return; } break; case 0x0a://Enter if(curno = eMenu->record[MenuIndex(menu)].subno) { AddSubMenu(fname,curno); return; } else { MenuFunc(eMenu->record[MenuIndex(menu)].cmd); pos_menu_cursor(menu);//光标复位 update_panels(); doupdate(); } break; case 0x1b://Enter DelSubMenu(); update_panels(); doupdate(); return; default: menu_driver(menu,c); break; }}int DrawMenu(char *fname){ eMenu = hMenu = (MENU_NODE * ) malloc(sizeof(MENU_NODE)); eMenu->next = NULL; AddSubMenu(fname,0); do { MenuDriver(fname); }while(eMenu != hMenu); free(hMenu);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -