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

📄 curlib.c

📁 用C语言实现的字符型的菜单界面
💻 C
📖 第 1 页 / 共 5 页
字号:
/*----------------------------------------------------------------------------* * 功    能: 光标库文件.				                                          * * 版    本: 1.00                                                             * * 运行环境: SCO UNIX V3.2.4 以上版本.					                           * * 历史记录: 日      期	作  者	备    注				                           * *----------------------------------------------------------------------------* *           1999/10/20	赖正兴	创建                                         * *----------------------------------------------------------------------------* * All rights reserved. Copyright (C) 1999-20001.                             * *----------------------------------------------------------------------------*/#include "curlib.h"/* * Globel varibles. *//***************************************************************************/attr_t screen;	/* 屏幕属性 *//***************************************************************************//***************************************************************************/int need_check_flag = 0;int is_tty_flag     = 0;	/* 1.终端 0.主机控制台*/int not_color       = 0;	/* 1.不支持颜色 0.支持颜色 */int begin_work_flag = -1;	/* begin_work() Use *///int argc;//char **argv;uchar sysbox_starty   = 10;	/* 系统提示的行位置 */uchar screen_starty   = 0;	/* screen 左上角 starty */uchar screen_startx   = 0;	/* screen 左上角 startx */uchar screen_endy     = 23;	/* screen 右下角 endy   */uchar screen_endx     = 79;	/* screen 右下角 endx   */uchar screen_maxrow   = 24;	/* screen 最大行 */uchar screen_maxcol   = 80;	/* screen 最大列 *//***************************************************************************//* * Local micros define. */#define DISPLAY_LENGTH	512/* * Local struct define. */typedef struct msgcmd_s {	uchar id;	char text[11];	int  coord;	struct msgcmd_s *next;	struct msgcmd_s *prev;	} msgcmd_t;/* * Local variables. */static window_t *windows[WINDOW_NUM];static int window_num;static vs_t vs;static char dispbuf[512];/* * Local function decleare. *//* * Functions. *//******************************************************************************  * <第一章> 屏幕窗口函数.                                                     * ******************************************************************************/ set_mode() {	struct termio term;	if (ioctl(0,TCGETA,&term) == -1 )	{		perror("ioctl(TCGETA)");		end_work();	}	term.c_lflag &= ~ICANON;	term.c_lflag &= ~ECHO;	term.c_cc[VMIN] = 0;	term.c_cc[VTIME] = 1;	if( ioctl(0,TCSETA,&term) == -1 ) /* Change Terminal Read_Define */	{		perror("ioctl(TCSETA)");		end_work();	}}/*----------------------------------------------------------------------------* * Function: Initialize screen. * Argument: *           None. * Return  :  *           TRUE: successed. *           FALSE: failured. *----------------------------------------------------------------------------*/int begin_work(void){	char *ttyname(),name[80];	if( begin_work_flag != -1 )		return(TRUE);	initscr();             /* Initialize Screen         */	set_mode();	umask(0);              /* Change File Right (666)     */	signal(SIGHUP ,SIG_IGN);	signal(SIGINT ,SIG_IGN);	signal(SIGQUIT,SIG_IGN);	signal(SIGILL ,end_work);	signal(SIGTRAP,end_work);	signal(SIGIOT ,end_work);	signal(SIGABRT,end_work);	signal(SIGKILL,end_work);	signal(SIGTERM,end_work);	signal(SIGUSR1,end_work);	begin_work_flag = 0;	strcpy(name,ttyname(0));	if(memcmp(name,"/dev/tty01",10)==0 || memcmp(name,"/dev/tty02",10)==0 ||	   memcmp(name,"/dev/tty03",10)==0 || memcmp(name,"/dev/tty04",10)==0 ||	   memcmp(name,"/dev/tty05",10)==0 || memcmp(name,"/dev/tty06",10)==0 ||	   memcmp(name,"/dev/tty07",10)==0 || memcmp(name,"/dev/tty08",10)==0 ||	   memcmp(name,"/dev/tty09",10)==0 || memcmp(name,"/dev/tty10",10)==0 ||	   memcmp(name,"/dev/tty11",10)==0 || memcmp(name,"/dev/tty12",10)==0 ||	  (memcmp(name,"/dev/ttyp",9)==0 && memcmp(getenv("TERM"),"ansi",4)==0) ||	   memcmp(name,"/dev/ttysyscon",14)==0 )	{		is_tty_flag     = 0;		screen_endy     = 24;	/* screen 右下角 endy   */		screen_maxrow   = 25;	/* screen 最大行 */	}	else	{		is_tty_flag     = 1;		screen_endy     = 23;	/* screen 右下角 endy   */		screen_maxrow   = 24;	/* screen 最大行 */	}#if 0	sprint(0,0,"is_tty_flag=%d name:%s tty:%s",is_tty_flag,name,getenv("TERM"));	get_char();#endif	set_color_pair();	if( is_tty_flag || !has_colors() )	{		not_color       = 1;	/* 1.不支持颜色 0.支持颜色 */		set_tty_attr();	}	else	{		not_color       = 0;	/* 1.不支持颜色 0.支持颜色 */		screen.title  = COL(RED,WHITE);	 /* 标题(前景色,背景色) */		screen.text   = COL(WHITE,BLACK);/* 正文(前景色,背景色) */		screen.board  = COL(BLACK,WHITE);/* 边框(前景色,背景色) */		screen.client = COL(WHITE,CYAN); /* 客户区颜色(前景色,背景色) */		screen.select = COL(BLACK,GREEN);/* 选项(前景色,背景色) */		screen.hotkey = COL(RED,BLACK);  /* 热键(前景色,背景色) */		screen.shade  = COL(CYAN,BLACK); /* 阴影(前景色,背景色) */		screen.prompt = COL(WHITE,BLACK);/* 提示颜色(前景色,背景色) */		screen.edit   = COL(WHITE,BLACK);/* 编辑颜色(前景色,背景色) */		screen.wstyle = WINDOW_CHINESE|WINDOW_SHADE;/* 窗口风格 */	}	return(TRUE);}void set_tty_attr(void){	screen.title  = A_REVERSE;/* 标题(前景色,背景色) */	screen.text   = A_NORMAL;/* 正文(前景色,背景色) */	screen.board  = A_NORMAL;/* 边框(前景色,背景色) */	screen.client = A_NORMAL;/* 客户区颜色(前景色,背景色) */	screen.select = A_REVERSE;/* 选项(前景色,背景色) */	screen.hotkey = A_UNDERLINE;     /* 热键(下划线) */	screen.shade  = A_NORMAL;/* 阴影(前景色,背景色) */	screen.prompt = A_REVERSE;/* 提示颜色 (前景色,背景色) */	screen.edit   = A_REVERSE;/* 编辑颜色(前景色,背景色) */	screen.wstyle = WINDOW_CHINESE;  /* 窗口风格 */}/*----------------------------------------------------------------------------* * Function: End screen. * Argument: *           None. * Return  :  *           None. *----------------------------------------------------------------------------*/void end_work(){	printf("%c[=%dF%c[=%dG%c[0m",27,7,27,0,27);	/*缺省黑底白字*/	clear(); touchwin(stdscr); refresh();	endwin(); /* Initialize Screen */	exit(0);	/* Exit Program */}/*----------------------------------------------------------------------------* * FUNCTION: 初始化系统颜色. * Argument: *           None. * Return  :  *           None. *----------------------------------------------------------------------------*/set_color_pair(){	short i,j;	if( has_colors() )	{		if( start_color() == OK )		{			for(i=0;i<COLORS;i++)				for(j=0;j<COLORS;j++)					init_pair((short)(i+j*COLORS),i,j);			return(TRUE);		}		else			return(FALSE);	}	else		return(FALSE);}/*----------------------------------------------------------------------------* * Function: 关闭或打开光标. * Argument: *           int flag -  0.CUR_DISABLE 1.CUR_ENABLE. * Return  :  *           None. *----------------------------------------------------------------------------*/void cursor_control(int flag){	if( !is_tty_flag )	{#ifdef SCO_UNIX	if( flag == CUR_DISABLE )	{	}	else	{	}#endif		return;	}	if( flag == CUR_DISABLE )	{		printf("%c[?%dl",KeyEsc,25);	}	else	{		printf("%c[?%dh",KeyEsc,25);	}}/*----------------------------------------------------------------------------* * Function: 创建一个窗口. * Argument: *           uchar sy - 指定box的开始行坐标. *           uchar sx - 指定box的开始列坐标. *           uchar row - 指定box中文本的行数. *           uchar col - 指定box中文本的列数. *           chtype tattr - 文本的前景色和背景色. *           chtype battr - 边框的前景色和背景色. *           chtype flag  - WINDOW_SHADE: 阴影 WINDOW_ENGLISH: 英文制表符. * Return  :  *           window_t * - 创建的窗口指针. *           NULL - 创建失败. *----------------------------------------------------------------------------*/window_t *create_window(uchar sy,uchar sx,uchar row,uchar col,chtype tattr,chtype battr,chtype style){	window_t *win;	if( need_check_flag )	{		if((debug_yx(sy,sx,"create_window()") == FALSE) || 		(debug_rowcol(row,col,"create_window()") == FALSE) || 		(debug_yx(sy+row-1,sx+col-1,"create_window()") == FALSE) ) 			return(FALSE);	}	win=NULL;	if( (win=(window_t *)malloc(sizeof(window_t))) == NULL )	{		return NULL;	}	memset(win,'\0',sizeof(window_t));	win->sy = sy;	win->sx = sx;	if( style & WINDOW_NO_BOARD )	{		win->row = row;		win->col = col;	}	else if( style & WINDOW_CHINESE )	{		if( style & WINDOW_SHADE )		{			win->row = row+3;			win->col = col+6;		}		else		{			win->row = row+2;			win->col = col+4;		}	}	else	/* English board */	{		if( style & WINDOW_SHADE )		{			win->row = row+3;			win->col = col+3;		}		else		{			win->row = row+2;			win->col = col+2;		}	}	win->tattr = tattr;	win->battr = battr;	win->style = style;	return win;}/*----------------------------------------------------------------------------* * Function: 显示一个窗口,并保存窗口所覆盖的区域. * Argument: *           window_t *win - 窗口指针. * Return  :  *           TRUE  - Success. *           FALSE - Failure. *----------------------------------------------------------------------------*/show_window(window_t *win){	register uchar i,j;	chtype *ptr;	if( win == NULL )		return FALSE;	if( (win->buf=(chtype *)malloc((win->row)*(win->col)*sizeof(chtype)+1)) == NULL )	{		return FALSE;	}	ptr = win->buf;	for(i=win->sy;i<win->sy+win->row;i++)	{		for(j=win->sx;j<win->sx+win->col;j++)		{			*ptr++=mvwinch(stdscr,i,j);		}	}	tdraw_box(win->sy,win->sx,win->row,win->col,win->tattr,win->battr,win->style);	return TRUE;}/*----------------------------------------------------------------------------* * Function: 隐一个窗口,并恢复窗口所覆盖的区域. * Argument: *           window_t *win - 窗口指针. * Return  :  *           TRUE  - Success. *----------------------------------------------------------------------------*/hide_window(window_t *win){	register uchar i,j;	chtype *ptr;	if( win == NULL )		return TRUE;	/* Restore old area */	if( win->buf != NULL )	{		ptr = win->buf;		for(i=win->sy;i<win->sy+win->row;i++)		{			for(j=win->sx;j<win->sx+win->col;j++)			{				mvwaddch(stdscr,i,j,*ptr++);			}		}		wrefresh(stdscr);	}	free(win->buf);	return TRUE;}/*----------------------------------------------------------------------------* * Function: 删除一个窗口,并恢复窗口所覆盖的区域. * Argument: *           window_t *win - 窗口指针. * Return  :  *           TRUE  - Success. *----------------------------------------------------------------------------*/delete_window(window_t *win){	register uchar i,j;	chtype *ptr;	if( win == NULL )		return TRUE;	/* Restore old area */	if( win->buf != NULL )	{		ptr = win->buf;		for(i=win->sy;i<win->sy+win->row;i++)		{			for(j=win->sx;j<win->sx+win->col;j++)			{				mvwaddch(stdscr,i,j,*ptr++);			}		}		wrefresh(stdscr);	}	free(win->buf);	free(win);	return TRUE;}/*----------------------------------------------------------------------------* * FUNCTION: 保存一块屏幕区域, 显示一个窗口.  * Argument: *           uchar sy - 开始行. *           uchar sx - 开始列. *	     uchar row - 行数. *	     uchar col - 列数. * Return  :  *           TRUE - 成功. *           FALSE - 失败. * 说    明: *           同 restore_window() 成对使用. *----------------------------------------------------------------------------*/save_window(uchar sy,uchar sx,uchar row,uchar col){	if( need_check_flag )	{		if((debug_yx(sy,sx,"save_window()") ==FALSE) || 	   	(debug_rowcol(row,col,"save_window()") ==FALSE) || 	   	(debug_yx(sy+row-1,sx+col-1,"save_window()") ==FALSE) ) 			return(FALSE);	}	window_num++;	if( window_num >= WINDOW_NUM )	{		sprintf(dispbuf,"◆ 警告: 当前窗口号已超过 WINDOW_NUM[%d] !",WINDOW_NUM);		disp_sysbox(dispbuf);		return(FALSE);	}	if( (windows[window_num]=create_window(sy,sx,row,col,screen.text,screen.board,screen.wstyle)) == NULL )	{		return -1;	}	show_window(windows[window_num]);	return(TRUE);}/*----------------------------------------------------------------------------* * FUNCTION: 保存一块屏幕区域, 显示一个窗口.  * Argument: *           无. * Return  :  *           TRUE - 成功. * 说    明: *           同 save_window() 成对使用. *----------------------------------------------------------------------------*/restore_window(){	delete_window(windows[window_num]);	window_num--;	if( window_num < 0 )		window_num == 0;	return(TRUE);}/*----------------------------------------------------------------------------* * FUNCTION: 保存一块屏幕区域, 显示一个窗口.  * Argument: *           uchar sy - 开始行. *           uchar sx - 开始列. *	          uchar row - 行数. *	          uchar col - 列数. * Return  :  *           TRUE - 成功. *           FALSE - 失败. * 说    明: *           同 restore_vs() 一起使用. *----------------------------------------------------------------------------*/save_vs(int sy,int sx,int row,int col){#if 1	int  i,j;	char fname[81],tname[30],*ttyname();	chtype *ptr;	FILE *fp;	if( need_check_flag )	{		if((debug_yx(sy,sx,"save_vs()") ==FALSE) || 	   	(debug_rowcol(row,col,"save_vs()") ==FALSE) || 	   	(debug_yx(sy+row-1,sx+col-1,"save_vs()") ==FALSE) ) 			return(FALSE);	}	strcpy(tname,ttyname(0));	strcce(tname,'/','_');	sprintf(fname,".screen.%d%s",getuid(),&tname[strlen(tname)-3]);	if( (fp=fopen(fname,"w")) == NULL )		return FALSE;	vs.sy = sy; vs.sx = sx; vs.row = row; vs.col = col;	fprintf(fp,"%02d%02d%02d%02d\n",sy,sx,row,col);	ptr = (chtype *)vs.buf;	for(i=sy;i<sy+row;i++)	{		for(j=sx;j<sx+col;j++)		{			*ptr=mvwinch(stdscr,i,j);			fprintf(fp,"%d ",*ptr);			ptr++;		}	}	fclose(fp);		//cls(sy,sx,row,col,COL(WHITE,BLACK));#else

⌨️ 快捷键说明

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