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

📄 listbox.c

📁 sco unix 前台界面开发程序,采用UNIX中的词法分析器和语法分析器
💻 C
字号:
#include <curses.h>#include <panel.h>#include <menu.h>#include <stdlib.h>#include "public.h"#include "screen.h"#include "listbox.h"void FreeList(LIST_NODE *p) {	MENU *menu = p->menu;	ITEM** items = menu_items(menu);	WINDOW* win = menu_win(menu);	WINDOW* sub = menu_sub(menu);	PANEL *panel = p->panel;	LIST_RECORD *record = p->record;	unpost_menu(menu);    	werase(win);         	wrefresh(win);       	delwin(sub);         	delwin(win);	while(*items) free_item(*items++);	del_panel(panel);	free(record);	free(p);}LIST_NODE *InitList(int y, int x, int disp, char *fname)//0-成功 !0-失败{	LIST_NODE *p;	int rows, cols, maxitem = 0;	int cnt = 0;	char buf[80], name[80], tmp[80];	ITEM **items;	LIST_RECORD *record;	MENU *menu;	FILE *fp;	WINDOW *win;	PANEL *panel;		if((fp = fopen(fname,"r")) == NULL) {		fprintf(stderr,"读列表文件[%s]失败\r",fname);		return(NULL);	}	while((fscanf(fp, "%[^\n]\n", buf) != EOF)) maxitem++;	rewind(fp);	items = (ITEM **)calloc(maxitem + 1,sizeof(ITEM));	record = (LIST_RECORD *)calloc(maxitem + 1,sizeof(LIST_RECORD));	if(disp > maxitem) disp = maxitem;	while((fscanf(fp, "%[^\n]\n", buf) != EOF)) {		memset(name, 0, sizeof(name));		memset(tmp, 0, sizeof(tmp));		GetString(tmp, buf, 1, '|');		strcat(name, tmp);		memset(record[cnt].ret, 0 ,sizeof(record[cnt].ret));		strcpy(record[cnt].ret, Trim(tmp)); 		strcat(name, " ");		memset(tmp, 0, sizeof(tmp));		GetString(tmp, buf, 2, '|'); 		strcat(name, tmp); 		memset(record[cnt].name, 0, sizeof(record[cnt].name));		strcpy(record[cnt].name, name);  		items[cnt] = new_item(record[cnt].name,NULL);        		cnt++;	}	items[cnt] = (ITEM *) NULL;	fclose(fp);		if(!(menu = new_menu(items))){ //建立列表项 		perror("建立列表项失败!");		return(NULL);	}	set_menu_format(menu, disp, 1);	scale_menu(menu, &rows, &cols);	menu_opts_off(menu,O_SHOWDESC);	if(win = newwin(rows + 2, cols + 4, y, x)) { //建立新窗口		if((panel = new_panel(win)) == NULL) { //窗口与屏面关联			perror("建立列表屏幕失败!");			return(NULL);		}		keypad(win, TRUE);		set_menu_win(menu, win);//菜单与窗口关联		set_menu_sub(menu, derwin(win, rows, cols, 1, 2));//画菜单子项	}	else {		perror("建立列表窗口失败!");		return(NULL);	}	box(win, 0, 0);	if(post_menu(menu) != E_OK ) { //显示菜单 		perror("显示列表失败!");		return(NULL);	}	else {		update_panels();//更新屏幕		doupdate();//刷新	}		p = (LIST_NODE * ) malloc(sizeof(LIST_NODE));	p->record = record;	p->menu = menu;	p->panel = panel;	return(p);}int ListIndex(MENU *menu){	return(item_index(current_item(menu)));}char *DriverList(LIST_NODE *p){	int c;	MENU *menu = p->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 'N':				menu_driver(menu, REQ_SCR_DPAGE);				break;			case 'P':				menu_driver(menu, REQ_SCR_UPAGE);				break;			case 0x0a://Enter				return(p->record[ListIndex(menu)].ret);			case 0x1b://ESC				return((char *) 0);			default:				menu_driver(menu,c);				break;		}}/*char *ListBox(int y, int x, int len, char *fname){	static char listret[32];	LIST_NODE *p;	int ret;	if((p = InitList(y, x, len, fname)) == NULL)		 return((char *) NULL);	strcpy(listret, DriverList(p));	FreeList(p);	return(listret);}*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -