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

📄 menulib.c

📁 用C语言实现的字符型的菜单界面
💻 C
📖 第 1 页 / 共 3 页
字号:
				ret = ERR_FORMAT;				break;			}			ptr[level]->citem->next = ptr[level]->hitem;			ptr[level]->hitem->prev = ptr[level]->citem;			if( level == 0 )			{				ptr[level]->citem = ptr[level]->hitem;				ret = 0;				break;	/* Success, exit */			}			else			{				ptr[level]->parent=ptr[level-1];				level--;			}		}		else		{			disp_sysbox(buf);			ret = ERR_NO_KEYWORD;			break;		}	}	fclose(fp);	if( ret < 0 )		return ret;	if( not_color )	{		set_tty_attr();	}	if( menu_create(menuhead.menu) == FALSE )		return ERR_CREATE_MENU;	return 0;}/*----------------------------------------------------------------------------* * Function: 设置菜单位置. * Argument:  *           menu_t *menu - 菜单. * Return  :  *           TRUE 成功. *           FALSE 失败. *----------------------------------------------------------------------------*/menu_window_setup(menu_t *menu){	int px,pw,cw;	uchar sy,sx,row,col,len;	menuitem_t *ptr;	/* Find out max len ,and adjust len to odd */	ptr = menu->hitem;	row = col = 0;	do {		row++;		if( ptr->index != 0 )	/* Not sepapator */		{			len = strlen(ptr->text);			if( strchr(ptr->text,'&') != NULL )				len--;			if( len > col )				col = len;		}		ptr = ptr->next;	} while( ptr != menu->hitem );	if( col % 2 )		col++;	/* This is the top menu window && pulldown menu style */	if( menu->parent == NULL && screen.mstyle & MENU_PULLDOWN )	{		/* Create window */		if( screen.mstyle & MENU_BOX )		{			if( (menu->win=create_window(menuhead.sy,menuhead.sx,1,76,				screen.text,screen.board,screen.wstyle)) == NULL )			{				return FALSE;			}			menuhead.sy += 1;			menuhead.sx += 2;		}		else		{			if( (menu->win=create_window(menuhead.sy,menuhead.sx,1,80,				screen.text,screen.board,WINDOW_NO_BOARD)) == NULL )			{				return FALSE;			}		}		return TRUE;	}	/* Adjust text's length to max length */	ptr = menu->hitem;	do {		if( ptr->index != 0 )	/* Not sepapator */		{			len = strlen(ptr->text);			if( strchr(ptr->text,'&') != NULL )				len--;			if( len < col )			{				if( (ptr->text=(char *)realloc(ptr->text,col+1)) == NULL )					return FALSE;				strcat(ptr->text,space(col-len));			}		}		ptr = ptr->next;	} while( ptr != menu->hitem );	col+=2;	/* For display ">>" or "√" */	if( screen.mstyle & MENU_DISP_NUMBER )		col+=2;	/* This is the top menu window && popup menu style */	if( menu->parent == NULL && screen.mstyle & MENU_POPUP )	{		/* Create window */		if( (menu->win=create_window(menuhead.sy,menuhead.sx,row,col,			screen.text,screen.board,screen.wstyle)) == NULL )		{			return FALSE;		}		return TRUE;	}	/* This is the other level menu window */	/* This is the pulldown menu's second level submenu */	if( (screen.mstyle & MENU_PULLDOWN) && (menu->parent->parent == NULL) )	{		sy = menu->parent->win->sy+1;		if( screen.mstyle & MENU_BOX )		{			sy ++;		}		if( screen.mstyle & MENU_SITE_CENTER )		{			px = menu->parent->citem->site+2;			pw = strlen(menu->parent->citem->text);			cw = col;			if( px + (pw - cw) / 2 < 0 )				sx = 0;			else			{				sx = px + (pw - cw - 8) / 2;			}		}		else		{			sx = menu->parent->citem->site;		}	}	else 	/* This is the popup menu's second level submenu &&     * pulldown menu's third level submenu 	 */	{		sy = menu->parent->win->sy+menu->parent->citem->site+1;		if( screen.mstyle & MENU_SITE_LEFT )		{			sx = menu->parent->win->sx+2;		}		else if( screen.mstyle & MENU_SITE_CENTER )		{			px = menu->parent->win->sx;			if( screen.mstyle & MENU_DISP_NUMBER )				px+=2;			pw = strlen(menu->parent->citem->text);			cw = col;			if( px + (pw - cw) / 2 < 0 )				sx = 0;			else			{				if( pw > cw )				{					sx = px + (pw - cw) / 2;				}				else					sx = px + (pw - cw - 1) / 2;			}		}		else /* MENU_SITE_RIGHT */		{			if( screen.wstyle & WINDOW_SHADE )				sx = menu->parent->win->sx+menu->parent->win->col-6;			else				sx = menu->parent->win->sx+menu->parent->win->col-4;		}	}	/* Adjust sy < screen_endy && sx < screen_endx */	if( sy > screen_endy )	{		sy = screen_endy;	}	if( sy+row+3 > screen_maxrow )	{		sy = screen_maxrow-row-3;	}	if( sx > screen_endx )	{		sx = screen_endx;	}	if( sx+col+5 > screen_endx )	{		if( screen.wstyle & WINDOW_SHADE )			sx = screen_endx-col-5;		else			sx = screen_endx-col-3;		if( screen.mstyle & MENU_SITE_LEFT || screen.mstyle & MENU_SITE_CENTER )		{			if( menu->parent->parent != NULL && sx > menu->parent->win->sx+2 )				sx = menu->parent->win->sx+2;		}	}	/* Create window */	if( (menu->win=create_window(sy,sx,row,col,screen.text,screen.board,		screen.wstyle)) == NULL )	{		return FALSE;	}	return TRUE;}menu_create(menu_t *menu){	menu_t *ptr;	ptr = menu;	ptr->citem = ptr->hitem;	if( menu_window_setup(ptr) == FALSE )		return FALSE;	while(1)	{		if( ptr->citem->child != NULL )		{			ptr = ptr->citem->child;			ptr->citem = ptr->hitem;			if( menu_window_setup(ptr) == FALSE )				return FALSE;		} 		else		{			ptr->citem = ptr->citem->next;			if( ptr->citem == ptr->hitem )			{				while( ptr->parent != NULL )				{					ptr = ptr->parent;					ptr->citem = ptr->citem->next;					if( ptr->citem != ptr->hitem )						break;				}				if( ptr->parent == NULL && ptr->citem == ptr->hitem )					return TRUE;			}		} 	}}/*----------------------------------------------------------------------------* * Function: 显示菜单条目(该条目由 menu->citem 确定). * Argument: *           menu_t *menu - 菜单项指针. *           chtype flag  - NOV: 正常显示 REV: 反显. * Return  :  *           TRUE. *----------------------------------------------------------------------------*/disp_menuitem(menu_t *menu,chtype flag){	int i,j,site,len,sx;	char buf[100];	short f1,b1,f2,b2;	chtype attr,hattr;	menuitem_t *citem;	window_t *cwin;	cwin = menu->win;	citem = menu->citem;		if( not_color )	{		if( flag == REV )		{			if( citem->flag & MF_GRAYED )			{				attr = flag|A_DIM;				hattr= flag|A_DIM|screen.hotkey;			}			else			{				attr = flag;				hattr = flag|screen.hotkey;			}		}		else		{			if( citem->flag & MF_GRAYED )			{				attr = A_DIM;				hattr= A_DIM|screen.hotkey;			}			else			{				attr = flag;				hattr = flag|screen.hotkey;			}		}	}	else	{		if( flag == REV )		{			attr = screen.select;		}		else		{			attr = screen.text;		}		pair_content((short)PAIR_NUMBER(attr),&f1,&b1);		pair_content((short)PAIR_NUMBER(screen.hotkey),&f2,&b2);		hattr=COL(f2,b1);		if( citem->flag & MF_GRAYED )		{			attr = COL(f1|EXTRA_COLOR,b1|EXTRA_COLOR)|A_DIM;			hattr= COL(f2|EXTRA_COLOR,b1|EXTRA_COLOR)|A_DIM;		}	}	/* Display sepapator line */	if( citem->index == 0 )	{		draw_line(cwin->sy+citem->site,cwin->sx,cwin->col);		return TRUE;	}	if( screen.wstyle & WINDOW_CHINESE )	{		sx = cwin->sx+2;	}	else	{		sx = cwin->sx+1;	}	len=strlen(citem->text);	if( strchr(citem->text,'&') == NULL )	{		/* Pulldown's top menu */		if( (screen.mstyle & MENU_PULLDOWN) && (menu->parent == NULL) ) 		{			if( (screen.mstyle & MENU_DISP_NUMBER) && (citem->index < 10) )			{				if( screen.mstyle & MENU_BOX )				{					aprint(cwin->sy+1,citem->site+2,attr,"%d.",citem->index);					aprint(cwin->sy+1,citem->site+4,attr,citem->text);				}				else				{					aprint(cwin->sy,citem->site,attr,"%d.",citem->index);					aprint(cwin->sy,citem->site+2,attr,citem->text);				}			}			else			{				if( screen.mstyle & MENU_BOX )				{					aprint(cwin->sy+1,citem->site+2,attr,citem->text);				}				else				{					aprint(cwin->sy,citem->site,attr,citem->text);				}			}		}		else		{			if( (screen.mstyle & MENU_DISP_NUMBER) && (citem->index < 10) )			{				aprint(cwin->sy+citem->site,sx,attr,"%d.",citem->index);				sx += 2;			}			aprint(cwin->sy+citem->site,sx,attr,citem->text);			if( citem->child )				aprint(cwin->sy+citem->site,len+sx,attr,">>");			else				aprint(cwin->sy+citem->site,len+sx,attr,"  ");			if( citem->flag & MF_CHECKED )			{				if( screen.wstyle & WINDOW_CHINESE )					aprint(cwin->sy+citem->site,len+sx,attr,"√");				else					aprint(cwin->sy+citem->site,len+sx,attr," \xfb");			}		}	}	else	{		site=j=0;		for(i=0;i<len;i++)		{			if( citem->text[i] != '&' )				buf[j++] = citem->text[i];			else				site = i;		}		buf[j] = '\0';		len--;		if( (screen.mstyle & MENU_PULLDOWN) && (menu->parent == NULL) ) 		{			if( (screen.mstyle & MENU_DISP_NUMBER) && (citem->index < 10) )			{				if( screen.mstyle & MENU_BOX )				{					aprint(cwin->sy+1,cwin->sx+citem->site+2,attr,"%d.",citem->index);					aprint(cwin->sy+1,cwin->sx+citem->site+4,attr,buf);					aprint(cwin->sy+1,cwin->sx+citem->site+site+4,hattr,"%c",citem->text[site+1]);				}				else				{					aprint(cwin->sy,cwin->sx+citem->site,attr,"%d.",citem->index);					aprint(cwin->sy,cwin->sx+citem->site+2,attr,buf);					aprint(cwin->sy,cwin->sx+citem->site+site+2,hattr,"%c",citem->text[site+1]);				}			}			else			{				if( screen.mstyle & MENU_BOX )				{					aprint(cwin->sy+1,cwin->sx+citem->site+2,attr,buf);					aprint(cwin->sy+1,cwin->sx+citem->site+site+2,hattr,"%c",citem->text[site+1]);				}				else				{					aprint(cwin->sy,cwin->sx+citem->site,attr,buf);					aprint(cwin->sy,cwin->sx+citem->site+site,hattr,"%c",citem->text[site+1]);				}			}		}		else		{			if( (screen.mstyle & MENU_DISP_NUMBER) && (citem->index < 10) )			{				aprint(cwin->sy+citem->site,sx,attr,"%d.",citem->index);				sx += 2;			}			aprint(cwin->sy+citem->site,sx,attr,buf);			if( citem->child )				aprint(cwin->sy+citem->site,len+sx,attr,">>");			else				aprint(cwin->sy+citem->site,len+sx,attr,"  ");			if( citem->flag & MF_CHECKED )			{				if( screen.wstyle & WINDOW_CHINESE )					aprint(cwin->sy+citem->site,len+sx,attr,"√");				else					aprint(cwin->sy+citem->site,len+sx,attr," \xfb");			}			aprint(cwin->sy+citem->site,site+sx,hattr,"%c",citem->text[site+1]);		}	}	refresh();	return TRUE;}/*----------------------------------------------------------------------------* * Function: 显示一个菜单项的popup菜单. * Argument: *           menu_t *menu - 菜单项指针. * Return  :  *           TRUE. *----------------------------------------------------------------------------*/disp_menu(menu_t *menu){	menuitem_t	*old_citem;	if( show_window(menu->win) == FALSE )		return FALSE;	old_citem=menu->citem;	menu->citem=menu->hitem;	do	{		disp_menuitem(menu,NOR);		menu->citem = menu->citem->next;	} while( menu->hitem != menu->citem );	menu->citem = old_citem;	return TRUE;}/*----------------------------------------------------------------------------* * Function: 根据index获得相应菜单项的指针. * Argument: *           menu_t *menu - 菜单项指针. *           int    index - 索引值(1...n or Alt-'a'...'z'),不计分隔符. * Return  :  *           TRUE - 找到,移动当前菜单项指针. *           FALSE - 没找到. *----------------------------------------------------------------------------*/int get_menuhandle(menu_t *menu,uchar index){	uchar *p;	menuitem_t *ptr;	ptr = menu->hitem;	if( index >= 0 && index <= 9 )	{		do {			if( ptr->index == index )			{				menu->citem = ptr;				return TRUE;			}			else				ptr = ptr->next;		} while( menu->hitem != ptr );	}	else	{		do {			if((p=(uchar *)strchr(ptr->text,'&')) != NULL)			{				if( toupper(*++p) == toupper(index) )				{					menu->citem = ptr;					return TRUE;				}			}			ptr = ptr->next;		} while( menu->hitem != ptr );	}	return FALSE;}/*----------------------------------------------------------------------------* * Function: 显示标题. * Argument: *           None. * Return  :  *           None. *----------------------------------------------------------------------------*/void disp_title(){	if( MenuTitle[0] == 0 )		return;	strcce(MenuTitle,'"',' ');	wcls_line(stdscr,title_sy,0,80,screen.title);	attron(screen.title);	mvaddstr(title_sy,0,MenuTitle);	attroff(screen.title);	wrefresh(stdscr);}/*----------------------------------------------------------------------------* * Function: 显示版权信息. * Argument: *           None. * Return  :  *           None. *----------------------------------------------------------------------------*/void disp_copyright(){	int trow,tcol,len;	char title[80],*msg;	WINDOW *txtwin;	if( menuhead.copyright == NULL )		return;	strcce(menuhead.copyright,'"',' ');	len = strlen(menuhead.copyright);	if( (msg=(char *)malloc(len+1)) == NULL )		return;	if( count_chnum(menuhead.copyright,'\n') > 1 )	{		strcpy(title,get_item(menuhead.copyright,'\n',0));		memcpy(msg,menuhead.copyright+strlen(title)+1,len-strlen(title)-1);		msg[len-strlen(title)-1] = 0;	}	else	{		if( screen.wstyle & WINDOW_CHINESE )			strcpy(title,"标题");		else			strcpy(title,"Title");		strcpy(msg,menuhead.copyright);	}	trow = count_chnum(msg,'\n');	copyright_row = trow + 2;	if( screen.wstyle & WINDOW_SHADE )		copyright_row ++;	if( copyright_row > screen_maxrow) copyright_row = screen_maxrow;	tcol = get_item_maxlen(msg,'\n');	if( tcol <= 0 ) tcol = 20;	if( screen.wstyle & WINDOW_CHINESE )	{		if( screen.wstyle & WINDOW_SHADE )			copyright_col = tcol + 6;		else			copyright_col = tcol + 4;		if( copyright_col % 2 != 0 ) 		{			copyright_col++;			tcol++;		}	}	else	{		if( screen.wstyle & WINDOW_SHADE )			copyright_col = tcol + 3;		else			copyright_col = tcol + 2;	}	if( copyright_col > screen_maxcol ) copyright_col = screen_maxcol;		copyright_sy = (screen_maxrow - copyright_row) / 2;	copyright_sx = (screen_maxcol - tcol) / 2;	if( copyright_sx % 2 != 0 ) copyright_sx++;	tdraw_box((uchar)copyright_sy,(uchar)copyright_sx,(uchar)copyright_row,(uchar)copyright_col,screen.text,screen.board,screen.wstyle);	len = copyright_sx + (copyright_col - strlen(title)) / 2 ;	if( len % 2 != 0 ) len++;	/* Display title text */	attron(screen.title);	mvaddstr(copyright_sy,len-2,title);	attroff(screen.title);	if( screen.wstyle & WINDOW_CHINESE )	{		if( (txtwin=subwin(stdscr,trow,tcol,copyright_sy+1,copyright_sx+2)) == NULL )		{			return;		}	}	else	{		if( (txtwin=subwin(stdscr,trow,tcol+1,copyright_sy+1,copyright_sx+1)) == NULL )		{			return;		}

⌨️ 快捷键说明

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