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

📄 mymenu.c

📁 sco unix 前台界面开发程序,采用UNIX中的词法分析器和语法分析器
💻 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 + -