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

📄 usermenu.c

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