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

📄 disp_menu.c

📁 UNIX 界面程序
💻 C
📖 第 1 页 / 共 2 页
字号:
}


DispMenuItem0( wWin, iMenuNo, iCurrItem )
WINDOW	*wWin;
int	iMenuNo, iCurrItem;
{
	int	i, j, x, y, iNum;
	int	iChildMenu;
	int	iRow, iCol;
	char	sBuf[256];
	char	cPage = 0;
	int	iRow1, iCol1;

	GetWinParam(wWin);

	if (iMenuNo == 0 || iMenuNo == 1 && SMenu[1].iDispFormat == 0)
	{
		wmove(wWin, SMenu[iMenuNo].iLocateY + 1, 0);
		for (j = 0; j < G_maxx / 2; j++)
			wprintw(wWin, "━");

		if (iCurrItem != -1) {
			i = SMenu[0].iMenuItemSet[iCurrItem];
			if (SMenuItem[i].iPower) {
				if (!Access) {
					sprintf(sBuf, "%s %s", G_comp, G_tele);
					PromptBottomRight(LINES-1, 2, 1, sBuf);
				}
				PromptBottom(LINES-1, 1, 0, SMenuItem[i].sText);
			}
		}
	}
	y = SMenu[iMenuNo].iLocateY;
	x = SMenu[iMenuNo].iLocateX;
	iNum = SMenuActiveStatus[iMenuNo].h;
	/*
	 * 解决横向菜单项太多显示不下的问题:
	 * 屏幕满时先不显示,以"..."代替,光标移到时分屏显示
	 * 目前只支持不超过两屏
	 */
	if (SMenuActiveStatus[iMenuNo].iPageItem != 0 &&
	    iCurrItem >= SMenuActiveStatus[iMenuNo].iPageItem) {
		i = SMenuActiveStatus[iMenuNo].iPageItem;
		mvwprintw(wWin, y, x, "... ");
		x += 4;
	} else {
		i = 0;
	}
	wmove(wWin, y, x);
	wclrtoeol(wWin);
	wmove(wWin, y, x);
	for ( ; i < iNum; i++) {
		j = SMenu[iMenuNo].iMenuItemSet[i];
		getyx(wWin, iRow1, iCol1);
		if (iCol1 + strlen(SMenuItem[j].sName) > COLS - 6) {
			iCol1 = x;
			wmove(wWin, iRow1, iCol1);
			cPage++;
		}
		
		/*
		 * 根据操作员菜单项使用权限的不同,重新调整子菜单显示坐标
		 */
	//	if (SMenuItem[j].iPower || Access) {
			if (SMenuItem[j].cProcType == 'M' &&
			    SMenuItem[j].mproc != disp_table_screen) {
				iChildMenu = SMenuItem[j].iChildMenu;
				getyx(wWin, iRow, iCol);
				iRow = iRow + 1;
				if (iCol + GetMenuLen(iChildMenu) > COLS - 6) {
					iCol = COLS - 6 - GetMenuLen(iChildMenu);
				}
				SMenu[iChildMenu].iLocateY = iRow;
				SMenu[iChildMenu].iLocateX = iCol;
			}
			if (cPage) {
				mvwprintw(wWin, iRow1, 76, "...");
				wmove(wWin, iRow1, iCol1);
			} else
				DispItem0(wWin, SMenu[iMenuNo].iMenuItemSet[i], (iCurrItem == i));
	//	}
	}
	wrefresh(wWin);
}


int	DispMenuItem1( wWin, iMenuNo, iCurrItem )
WINDOW	*wWin;
int	iMenuNo, iCurrItem;
{
	int	i, j, k, x, y;
	int	iLength, iHeight;
	int	iRow, iCol;
	int	iChildMenu;
	int	IRealItem = 0;
	char	sBuf[256];

	y = SMenu[iMenuNo].iLocateY;
	x = SMenu[iMenuNo].iLocateX;
	iHeight = SMenuActiveStatus[iMenuNo].h;
	iLength = SMenuActiveStatus[iMenuNo].l;
	iLength = ((iLength-1)/2+1)*2;

	for (i = 0; i < iHeight; i++) {
		j = SMenu[iMenuNo].iMenuItemSet[i];
/* 
		if (!(SMenuItem[j].iPower || Access))
			continue;
*/
		mvwprintw(wWin, y + IRealItem + 1, x, "┃");
		DispItem1(wWin, j, (iCurrItem == i));
		for (k=0; k<iLength+iLength%2 - strlen(SMenuItem[j].sName); k++)
			wprintw(wWin, " ");
		wprintw(wWin, "┃");

		IRealItem++;

		/*
		 * 根据操作员菜单项使用权限的不同,重新调整子菜单显示坐标
		 * 子菜单的子菜单若遇屏幕边界,则改为在其父菜单的左边显示
		 */
		if (SMenuItem[j].iPower || Access) {
			if (SMenuItem[j].cProcType == 'M' &&
			    SMenuItem[j].mproc != disp_table_screen) {
				iChildMenu = SMenuItem[j].iChildMenu;
				getyx(wWin, iRow, iCol);
				if (iCol + GetMenuLen(iChildMenu) > COLS - 4) {
					iCol = iCol - iLength  - 8 - GetMenuLen(iChildMenu);
				}
				SMenu[iChildMenu].iLocateY = iRow;
				SMenu[iChildMenu].iLocateX = iCol;
			}
		}
	}

	GetWinParam(wWin);

	if (iCurrItem != -1) {
		i = SMenu[iMenuNo].iMenuItemSet[iCurrItem];
		if (SMenuItem[i].iPower) {
			if (!Access) {
				sprintf(sBuf, "%s %s", G_comp, G_tele);
				PromptBottomRight(LINES-1, 2, 1, sBuf);
			}
			PromptBottom(LINES-1, 1, 0, SMenuItem[i].sText);
		}
	}

	mvwprintw(wWin, y, x, "┏");
	for (i = 0; i < (iLength + 1) / 2; i++)
		wprintw(wWin, "━");
	wprintw(wWin, "┓");

	mvwprintw(wWin, y + IRealItem + 1, x, "┗");
	for (i = 0; i < (iLength + 1) / 2; i++)
		wprintw(wWin, "━");
	wprintw(wWin, "┛");
	wmove(wWin, y + IRealItem + 1, x + iLength + 2);
	wrefresh(wWin);
}



int	ClearMenu(wWin, iMenuNo)
WINDOW	*wWin;
int	iMenuNo;
{
	int	i, x, y, l, h;
	char	sSpaceStr[80];

	if (iMenuNo == 0 || iMenuNo == 1 && SMenu[1].iDispFormat == 0)
		return(0);
	x = SMenuActiveStatus[iMenuNo].x;
	y = SMenuActiveStatus[iMenuNo].y;
	l = SMenuActiveStatus[iMenuNo].l;
	h = SMenuActiveStatus[iMenuNo].h;
	memset(sSpaceStr, ' ', l + 5);
	sSpaceStr[l+5] = '\0';
	for (i = 0; i <= (h + 2) / 2; i++) {
		mvwprintw (wWin, y + i, x, sSpaceStr);
		mvwprintw (wWin, y + h + 1 - i, x, sSpaceStr);
	}
}

DispFrame(wWin)
WINDOW	*wWin;
{
	int	i;

	wclear(wWin);
	DispBelow("");
	GetWinParam(wWin);
	wmove(wWin, 1, 0);
	for (i = 0; i < G_maxx/2; i++) {
		wprintw(wWin, "━");
	}
	wmove(wWin, G_maxy-2, 0);
	for (i = 0; i < G_maxx/2; i++) {
		wprintw(wWin, "━");
	}
	wrefresh(wWin);
	return(0);
}

DispBelow(char *in)
{
	char sTitle[60], sHead[60];
	char	sStr[256];

	sprintf(sTitle, "%s 系统", G_system);
/*
	if (in[0]) {
		strcat(sTitle, " - ");
		strcat(sTitle, in);
	}
*/
	sprintf(sHead, "%*s%s%*s", (30 - strlen(sTitle)) / 2, "", sTitle, (30 - strlen(sTitle)) / 2 ,"" );
	sprintf(sHead, "%-30s", sHead);
	wattron( stdscr, WHITE_RED );
	mvwprintw(stdscr, 0, (COLS-strlen(sHead))/2, "%s", sHead);
	wattroff( stdscr, WHITE_RED );
	sprintf(sStr, "柜员:%s  ", G_oper_no);
	wattron( stdscr, CYAN_BLACK );
	mvwprintw(stdscr, 0, COLS - strlen(sStr), "%s", sStr);
	wattroff( stdscr, CYAN_BLACK );

	return(0);
}

/*
 * 获取窗口的最大行、列数,以及相对于stdscr的起始行、列偏移
 */

GetWinParam(wWin)
WINDOW	*wWin;
{
	if (wWin == stdscr) {
		G_maxy = LINES;
		G_maxx = COLS;
		G_begy = 0;
		G_begx = 0;
	} else {
		G_maxy = wWin->_maxy;
		G_maxx = wWin->_maxx;
		G_begy = wWin->_begy;
		G_begx = wWin->_begx;
	}
}

/*
 * 在屏幕底部一行,即LINES-1行上靠右显示提示信息
 *	col指定显示的倒数起始列,flag=0 正常添加信息,=1 则需清除原信息刷新显示
 * row, col均以stdscr的坐标指定
 */
PromptBottomRight(iRow, iCol, iFlag, pStr)
int	iRow, iCol;
int	iFlag;
char	*pStr;
{
	
	WINDOW	*wWin;
	int	i;
	char	sStr1[128];

	if (pTailWin != NULL)
		wWin = pTailWin;
	else
		wWin = stdscr;

	GetWinParam(wWin);

	if (iRow < G_begy)
		iRow = 0;
	else if (iRow >= G_begy + G_maxy)
		iRow = G_maxy -1;
	else
		iRow = iRow - G_begy;
	
	if (iCol < G_begx)
		iCol = 0;
	else if (iCol >= G_begx + G_maxx)
		iCol = G_maxx -1;
	else
		iCol = iCol - G_begx;

	if (strlen(pStr) > G_maxx - iCol)
		strcpy(sStr1, &pStr[strlen(pStr) - G_maxx - iCol]); 
	else
		strcpy(sStr1, pStr);

	if (iFlag == 1) {
		wmove(wWin, iRow, 0);
		for (i = 0; i < G_maxy; i++)
			wprintw(wWin, " ");;
	}

	/*
	 * 靠右显示
	 */
	iCol = G_maxx-1 - iCol - strlen(sStr1);
	iCol = (iCol+1)/2*2;


	wmove(wWin, iRow, iCol);
	wattron( wWin, WHITE_BLUE );
	wprintw(wWin, "%s", sStr1);
	wattroff( wWin, WHITE_BLUE );
	wrefresh(wWin);
}

/*
 * 在屏幕底部一行,即LINES-1行上显示提示信息
 *	row指定显示的起始列,flag=0 正常添加信息,=1 则需清除原信息刷新显示
 */
PromptBottom(iRow, iCol, iFlag, pStr)
int	iRow, iCol;
int	iFlag;
char	*pStr;
{
	WINDOW	*wWin;
	int	i;
	char	sStr1[128];

	if (pTailWin != NULL)
		wWin = pTailWin;
	else
		wWin = stdscr;

	GetWinParam(wWin);

	if (iRow < G_begy)
		iRow = 0;
	else if (iRow >= G_begy + G_maxy)
		iRow = G_maxy -1;
	else
		iRow = iRow - G_begy;
	
	if (iCol < G_begx)
		iCol = 0;
	else if (iCol >= G_begx + G_maxx)
		iCol = G_maxx -1;
	else
		iCol = iCol - G_begx;

	if (strlen(pStr) > G_maxx - iCol) {
		strncpy(sStr1, pStr, G_maxx - iCol); 
		sStr1[G_maxx-iCol] = '\0';
	} else
		strcpy(sStr1, pStr);

	if (iFlag == 1) {
		wmove(wWin, iRow, 0);
		for (i = 0; i < G_maxy; i++)
			wprintw(wWin, " ");;
	}

	wmove(wWin, iRow, iCol);
	wprintw(wWin, "%s", sStr1);
	wrefresh(wWin);
}

/*
 * 在屏幕顶部一行,即0行上靠右显示提示信息
 *	col指定显示的倒数起始列,flag=0 正常添加信息,=1 则需清除原信息刷新显示
 * row, col均以stdscr的坐标指定
 */
PromptTopRight(iRow, iCol, iFlag, pStr)
int	iRow, iCol;
int	iFlag;
char	*pStr;
{
	
	WINDOW	*wWin;
	int	i;
	char	sStr1[128];

	if (pHeaderWin != NULL)
		wWin = pHeaderWin;
	else
		wWin = stdscr;

	GetWinParam(wWin);

	if (iRow < G_begy)
		iRow = 0;
	else if (iRow >= G_begy + G_maxy)
		iRow = G_maxy -1;
	else
		iRow = iRow - G_begy;
	
	if (iCol < G_begx)
		iCol = 0;
	else if (iCol >= G_begx + G_maxx)
		iCol = G_maxx -1;
	else
		iCol = iCol - G_begx;

	if (strlen(pStr) > G_maxx - iCol)
		strcpy(sStr1, &pStr[strlen(pStr) - G_maxx - iCol]); 
	else
		strcpy(sStr1, pStr);

	if (iFlag == 1) {
		wmove(wWin, iRow, 0);
		for (i = 0; i < G_maxy; i++)
			wprintw(wWin, " ");;
	}

	/*
	 * 靠右显示
	 */
	iCol = G_maxx-1 - iCol - strlen(sStr1);


	wmove(wWin, iRow, iCol);
	wprintw(wWin, "%s", sStr1);
	wrefresh(wWin);
}
/*
 * 在屏幕顶部一行,即0行上显示提示信息
 *	row指定显示的起始列,flag=0 正常添加信息,=1 则需清除原信息刷新显示
 */
PromptTop(iRow, iCol, iFlag, pStr)
int	iRow, iCol;
int	iFlag;
char	*pStr;
{
	WINDOW	*wWin;
	int	i;
	char	sStr1[128];

	if (pHeaderWin != NULL)
		wWin = pHeaderWin;
	else
		wWin = stdscr;

	GetWinParam(wWin);

	if (iRow < G_begy)
		iRow = 0;
	else if (iRow >= G_begy + G_maxy)
		iRow = G_maxy -1;
	else
		iRow = iRow - G_begy;
	
	if (iCol < G_begx)
		iCol = 0;
	else if (iCol >= G_begx + G_maxx)
		iCol = G_maxx -1;
	else
		iCol = iCol - G_begx;

	if (strlen(pStr) > G_maxx - iCol) {
		strncpy(sStr1, pStr, G_maxx - iCol); 
		sStr1[G_maxx-iCol] = '\0';
	} else
		strcpy(sStr1, pStr);

	if (iFlag == 1) {
		wmove(wWin, iRow, 0);
		for (i = 0; i < G_maxy; i++)
			wprintw(wWin, " ");;
	}

	wmove(wWin, iRow, iCol);
	wprintw(wWin, "%s", sStr1);
	wrefresh(wWin);
}

/*
 * 获取子菜单的宽度
 */
int GetMenuLen(iMenuNo)
int	iMenuNo;
{
	FILE	*pMyMenuFp;
	char	sFileName[128];
	char	*pWorkDir;
	int	i, j;
	int	iLen, iLength;
	char	sMenuName[60];

	pWorkDir = (char *)getenv("WORKDIR");
	if (pWorkDir == NULL) {
		mvprintw(LINES-1, 0, "WORKDIR not set.");
		return(-1);
	}
	sprintf(sFileName, "%s%s", pWorkDir, MENU_f);
	pMyMenuFp = fopen(sFileName, "r");
	if (pMyMenuFp == NULL) {
		mvprintw(LINES-1, 0, "FIle %s open error.", sFileName);
		return(-1);
	}

	/*
	 * 从配置文件里读取菜单项信息,(名字可每次不同)
	 */
	if (GetItemInfo(iMenuNo, pMyMenuFp) < 0) {
		errcall(ERROR, "ERROR! please check file match.menu!");
		fclose(pMyMenuFp);
		return(-1);
	}

	i = iLength = 0;
	do {
		strcpy(sMenuName,
		    SMenuItem[SMenu[iMenuNo].iMenuItemSet[i]].sName);
		iLen = strlen(sMenuName);
		if (isdigit(sMenuName[iLen - 1])) iLen--;
		if (iLen > iLength)
			iLength = iLen;
	} while ( SMenu[iMenuNo].iMenuItemSet[++i] != -1 );

	fclose(pMyMenuFp);

	iLength = ((iLength - 1)/2+1) * 2;	/* 保证偶数 */

	return(iLength);
}

/*  
 * 重画菜单框及其菜单项
 *
 *	解决菜单重叠后的恢复显示问题
 */
int	RedrawMenu(wWin, iMenuNo, iItemNo, pMenuFile)
WINDOW	*wWin;
int	iMenuNo, *iItemNo;
FILE	*pMenuFile;
{
/*********
	if ( InitItemInfo( wWin, iMenuNo, pMenuFile) < 0 )
		return(ERR_MENU);
*********/

	if (SMenu[iMenuNo].iDispFormat == 0)
		DispMenuItem0( wWin, iMenuNo, *iItemNo );
	else	
		DispMenuItem1( wWin, iMenuNo, *iItemNo );

	return(0);
}

⌨️ 快捷键说明

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