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

📄 disp_menu.c

📁 UNIX 界面程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>
#include <ctype.h>
#include <varargs.h>
#include "db_struct_c.h"
#include "mytools.h"
#include "menu.h"
#include "main_menu.h"
#include "tool.h"
#include "color.h"
#include "macro_def.h"

#define ITEMS 256

extern char G_oper_no[];
extern struct screen_st scr;
extern char power_bak[ITEMS];
int Access = 0, item_all;

int	G_start_menu_no;
int	G_maxy, G_maxx, G_begy, G_begx;
extern WINDOW	*pHeaderWin;
extern WINDOW	*pTailWin;
extern WINDOW	*pMenuWin;
int disp_table_screen();

/*
 * 显示菜单项
 * 参数:item_no -- SMenuItem[]之下标
 *       flag    -- 标志。若为1,则反视显示。
 * 若菜单项之power为0,则以灰色显示,以示不可用
 */
void	DispItem0(wWin, iItemNo, iFlag)
WINDOW	*wWin;
int	iItemNo;
int	iFlag;
{
	char	sName[WIDTH1+1];
	int	iLen;

	strcpy(sName, SMenuItem[iItemNo].sName);
	/*
	 * 若菜单项名的最后一位是数字(??),则显示时去掉
	 */
	iLen = strlen(sName) - 1;
	if (isdigit(sName[iLen]))
		sName[iLen] = 0;

	if (SMenuItem[iItemNo].iPower) {
		if (iFlag) {
			wstandout(wWin);
			wprintw(wWin, " %s ", sName);
			wstandend(wWin);
		} else
			wprintw(wWin, " %s ", sName);
	} else {
		if ( !SMenuItem[iItemNo].iPower || Access) {
			if (iFlag) {
				wattron(wWin, BLUE_RED);
				wprintw(wWin, " %s ", sName);
				wattroff(wWin, BLUE_RED);
			} else {
				wattron(wWin, RED_BLUE);
				wprintw(wWin, " %s ", sName);
				wattroff(wWin, RED_BLUE);
			}
		}
	}
}

/*
 * 纵向显示菜单项
 * 参数:item_no -- SMenuItem[]之下标
 *       flag    -- 标志。若为1,则反视显示。
 * 若菜单项之power为0,则以灰色显示,以示不可用
 */
void	DispItem1(wWin, iItemNo, iFlag)
WINDOW	*wWin;
int	iItemNo;
int	iFlag;
{
	char sName[WIDTH1+1];
	int iLen;

	strcpy(sName, SMenuItem[iItemNo].sName);
	iLen = strlen(sName) - 1;
	if (isdigit(sName[iLen]))
		sName[iLen] = 0;

	if (SMenuItem[iItemNo].iPower) {
		if (iFlag) {
			wstandout(wWin);
			wprintw(wWin, "%s", sName);
			wstandend(wWin);
		} else
			wprintw(wWin, "%s", sName);
	} else {
		if ( !SMenuItem[iItemNo].iPower || Access) {
			if (iFlag) {
				wattron(wWin, BLUE_RED);
				wprintw(wWin, "%s", sName);
//				printw( "%s", sName);
				wattroff(wWin, BLUE_RED);
			} 
			else {
				wattron(wWin, RED_BLUE);
				wprintw(wWin, "%s", sName);
			//	printw( "%s", sName);
				wattroff(wWin, RED_BLUE);
				refresh();
			}
		}
	}
}

/*  
 * 接受光标移动键, 显示相应信息
 * 入口: 菜单号, 选择项号, 信息文件句柄
 * 出口: 被激活的选择项号
 * 出口条件: 接收的是回车键
 */
int	DispMenu(wWin, iMenuNo, iItem_no, pMenuFile)
WINDOW	*wWin;
int	iMenuNo, *iItem_no;
FILE	*pMenuFile;
{
	int	iRet ;

	if ( InitItemInfo( wWin, iMenuNo, pMenuFile) < 0 )
		return(ERR_MENU);

	if (SMenu[iMenuNo].iDispFormat == 0)
		iRet = DispMenu0(wWin, iMenuNo, iItem_no);
	else{
		iRet = DispMenu1(wWin, iMenuNo, iItem_no);
	}

	return(iRet);
}


/*
 * 横向显示
 */
int	DispMenu0(wWin, iMenuNo, iItemNo)
WINDOW	*wWin;
int	iMenuNo, *iItemNo;
{
	int	c, i, j, iCurrItem, iRet;

	iCurrItem = *iItemNo;
	iRet = 0;
	DispMenuItem0( wWin, iMenuNo, iCurrItem );
	do {
		c = getkey(wWin);	/*接受选择*/
		switch (c) {

		case CTRL_W:
			if (Access || (iCurrItem == -1)) continue;
			if (!iMenuNo)
				FunKeyHelp(SMenuItem[SMenu[iMenuNo].iMenuItemSet[iCurrItem]].sName + 2);
			else
				FunKeyHelp(SMenu[iMenuNo].sMenuName);
			break;
		case CTRL_L:	/* Redraw screen 刷新屏幕 */
			wrefresh( curscr );
			break;
		case LEFT:
			if (iCurrItem == -1)
				continue;
			j = iCurrItem;
			while (1) {
				if (iCurrItem == 0)
					iCurrItem = item_all;
				else
					iCurrItem--;
				i = SMenu[iMenuNo].iMenuItemSet[iCurrItem];

				if (Access && power_bak[i]) break;
				if (!Access && SMenuItem[i].iPower)
					break;
			}
			if (j == iCurrItem)
				continue;
			break;
		case SPACE:
			if (Access) {
				i = SMenu[iMenuNo].iMenuItemSet[iCurrItem];
				SMenuItem[i].iPower = !SMenuItem[i].iPower;
				break;
			}
		case RIGHT:
			if (iCurrItem == -1) continue;
			j = iCurrItem;
			while (1) {
				iCurrItem = (iCurrItem + 1) % (item_all + 1);
				i = SMenu[iMenuNo].iMenuItemSet[iCurrItem];
				if (Access && power_bak[i]) break;
				if (!Access && SMenuItem[i].iPower) break;
			}
			if (j == iCurrItem) continue;
			break;
		case ENTER:
		case CR:
			if (Access) {
				i = SMenu[iMenuNo].iMenuItemSet[iCurrItem];
				if (SMenuItem[i].mproc && SMenuItem[i].cProcType == 'M')
					continue;
			}
			if (iCurrItem == -1) continue;
			*iItemNo = iCurrItem;
			iRet = 1;
			break;
		case ESCAPE:
			if (Access)
				return(ERR_MENU);
			if (iMenuNo == 0)
				return(ERR_MENU);
			iCurrItem = item_all;
			*iItemNo = item_all;
			/*
			 * 主菜单及主菜单为横向时的子菜单,
			 * ESC键须清屏
			 */
			if(iMenuNo == 0 || iMenuNo == 1 && SMenu[1].iDispFormat == 0) {
				ClearMenu(wWin, iMenuNo);
				DispMenuItem0( wWin, iMenuNo, iCurrItem );
				return(ERR_MENU);
			}
			iRet = 1;
			break;
		case UP:
		case PGUP:
			if (Access || (iMenuNo == 0) || iMenuNo == 1 && SMenu[1].iDispFormat == 0/*主菜单横排 */)
				continue;
			sql_previous();
			break;
		case DOWN:
		case PGDN:
			if (Access || (iMenuNo == 0) || iMenuNo == 1 && SMenu[1].iDispFormat == 0)
				continue;
			sql_next();
			break;
		case HOME:
			if (Access || (iMenuNo == 0) || iMenuNo == 1 && SMenu[1].iDispFormat == 0)
				continue;
			sql_first();
			break;
		case END:
			if (Access || (iMenuNo == 0) || iMenuNo == 1 && SMenu[1].iDispFormat == 0)
				continue;
			sql_last();
			break;
		default:
			if (iCurrItem == -1)
				continue;
			for (i = 0; i <= item_all; i++) {
				j = SMenu[iMenuNo].iMenuItemSet[i];
				if (c == SMenuItem[j].cFirstChar ) {

					if (!Access && !SMenuItem[j].iPower)
						continue;
					iCurrItem = i;
					*iItemNo = iCurrItem;
					iRet = 1;
					break;
				}
			}
			if (i > item_all)
				continue;
			break;
		}
		DispMenuItem0( wWin, iMenuNo, iCurrItem );
	} while (iRet == 0);

	return( NORMAL );
}


/*
 * 纵向显示
 */
int	DispMenu1(wWin, iMenuNo, iItemNo)
WINDOW	*wWin;
int	iMenuNo, *iItemNo;
{
	int	c, i, j, iCurrItem, iRet;
	int	iStatus;

	iCurrItem = *iItemNo;
	iRet = 0;
	iStatus = NORMAL;
	DispMenuItem1( wWin, iMenuNo, iCurrItem );
	do {
		c = getkey(wWin);                           /*接受选择*/
		switch (c) {

		case CTRL_W:
			if (Access || (iCurrItem == -1)) continue;
			FunKeyHelp(SMenuItem[SMenu[iMenuNo].iMenuItemSet[iCurrItem]].sName + 2);
			break;
		case CTRL_L:	/* Redraw screen	*/
			wrefresh( curscr );
			break;
		case ESCAPE:
			*iItemNo = iCurrItem;
			iStatus = CLOSE;
			ClearMenu(wWin, iMenuNo);
			iRet = 1;
			break;
		case LEFT:
			/** 父菜单横向排列才有效 **/
			i = SMenuActiveStatus[iMenuNo].iFatherMenu;
			if (SMenu[i].iDispFormat == 0) {
				j = SMenuActiveStatus[i].iItem;
				while (1) {
					j++;
					if (SMenu[i].iMenuItemSet[j] == -1) j = 0;

				if (Access && power_bak[i]) break;
					if (!Access && SMenuItem[SMenu[i].iMenuItemSet[j]].iPower)
						break;
				}
				if (j == SMenuActiveStatus[i].iItem) continue;
				iStatus = OPEN_LEFT;
			} else
				iStatus = CLOSE;
			*iItemNo = iCurrItem;
			ClearMenu(wWin, iMenuNo);
			iRet = 1;
			break;
		case RIGHT:
			/** 父菜单横向排列才有效 **/
			i = SMenuActiveStatus[iMenuNo].iFatherMenu;
			if (SMenu[i].iDispFormat == 0) {
				j = SMenuActiveStatus[i].iItem;
				while (1) {
					j++;
					if (SMenu[i].iMenuItemSet[j] == -1) j = 0;

				if (Access && power_bak[i]) break;
					if (!Access && SMenuItem[SMenu[i].iMenuItemSet[j]].iPower)
						break;
				}
				if (j == SMenuActiveStatus[i].iItem) continue;
				iStatus = OPEN_RIGHT;
			} else
				iStatus = CLOSE;
			*iItemNo = iCurrItem;
			ClearMenu(wWin, iMenuNo);
			iRet = 1;
			break;
		case UP:
			if (iCurrItem == -1) continue;
			j = iCurrItem;
			while (1) {
				if (iCurrItem == 0) iCurrItem = item_all;
				else iCurrItem--;
				i = SMenu[iMenuNo].iMenuItemSet[iCurrItem];

				if (Access && power_bak[i]) break;
				if (!Access && SMenuItem[i].iPower) break;
			}
			if (j == iCurrItem) continue;
			break;
		case SPACE:
			if (Access) {
				i = SMenu[iMenuNo].iMenuItemSet[iCurrItem];
				SMenuItem[i].iPower = !SMenuItem[i].iPower;
				break;
			}
		case DOWN:
			if (iCurrItem == -1) continue;
			j = iCurrItem;
			while (1) {
				iCurrItem = (iCurrItem + 1) % (item_all + 1);
				i = SMenu[iMenuNo].iMenuItemSet[iCurrItem];

				if (Access && power_bak[i]) break;
				if (!Access && SMenuItem[i].iPower) break;
			}
			if (j == iCurrItem) continue;
			break;
		case ENTER:
		case CR:
			if (Access) {
				i = SMenu[iMenuNo].iMenuItemSet[iCurrItem];
				if (SMenuItem[i].mproc &&
				    SMenuItem[i].iChildMenu) continue;
			}
			if (iCurrItem == -1) continue;
			*iItemNo = iCurrItem;
			iRet = 1;
			break;
		default:
			if (iCurrItem == -1) continue;
			for (i = 0; i <= item_all; i++) {
				j = SMenu[iMenuNo].iMenuItemSet[i];
				if (c == SMenuItem[j].cFirstChar ) {

					if (!Access && !SMenuItem[j].iPower)
						continue;
					iCurrItem = i;
					*iItemNo = iCurrItem;
					iRet = 1;
					break;
				}
			}
			if (i > item_all) continue;
			break;
		}
		if ( iStatus == NORMAL ) {
			DispMenuItem1( wWin, iMenuNo, iCurrItem );
		}
	} while (iRet == 0);

	return(iStatus);
}


/*
 *   功能: 初始化菜单项信息
 *   入口: 菜单号, 菜单信息文件句柄
 *   出口:   菜单选择项名
 *   	选择项说明 
 *   	选择项首字母
 *   	选择项的帮助文件索引 
 *   	当前选择项所在行的首尾项号
 */
int	InitItemInfo( wWin, iMenuNo, pMenuFile)
WINDOW	*wWin;
int	iMenuNo;
FILE	*pMenuFile;
{
	int	c, i, j, iItemHead;
	int	iDispLen, iLen, iLen1, iLen2;
	char	sMenuName[20];

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

	/*
	 * 获取窗口参数G_maxy,G_maxx,G_begy,G_begx
	 */
	GetWinParam(wWin);

	for ( i = 0; i < MAXITEM; i++)
		SItemInfo[i].iHeadItem = SItemInfo[i].iTailItem = -1;
	iDispLen = G_maxx - strlen(sMenuName) - 2 - 4;   /*显示长度*/
	/** 5 room for ... **/
	i = iLen = iItemHead = iLen2 = 0;
	do {
		strcpy(sMenuName,
		    SMenuItem[SMenu[iMenuNo].iMenuItemSet[i]].sName);
		iLen1 = strlen(sMenuName);
		if (isdigit(sMenuName[iLen1 - 1])) iLen1--;
		if (iLen1 > iLen2)
			iLen2 = iLen1;
		if (iLen + 2 + iLen1 > iDispLen) {
			for (j = iItemHead ; j <= i - 1; j++) {
				SItemInfo[j].iHeadItem = iItemHead;
				SItemInfo[j].iTailItem = i - 1;
			}
			iItemHead = i;
			iLen = 2 + 6 + iLen1;
		} else 
			iLen += 2 + iLen1;
	} while ( SMenu[iMenuNo].iMenuItemSet[++i] != -1 );
	item_all = i - 1;
	for ( i = 0; i <= item_all; i++) {
		if (SItemInfo[i].iHeadItem == -1)
			SItemInfo[i].iHeadItem = iItemHead;
		if (SItemInfo[i].iTailItem == -1)
			SItemInfo[i].iTailItem = item_all;
	}
	SMenuActiveStatus[iMenuNo].y = SMenu[iMenuNo].iLocateY;
	SMenuActiveStatus[iMenuNo].x = SMenu[iMenuNo].iLocateX;
	SMenuActiveStatus[iMenuNo].l = iLen2;
	SMenuActiveStatus[iMenuNo].h = item_all + 1;
	if (SMenu[iMenuNo].iDispFormat == 1)
		return;
	iLen2 = SMenu[iMenuNo].iLocateX;
	for (i = 0; i <= item_all; i++) {
		j = SMenu[iMenuNo].iMenuItemSet[i];
		iLen2 = iLen2 + (strlen(SMenuItem[j].sName) + 2); 
		if (iLen2 > COLS -6) {
			SMenuActiveStatus[iMenuNo].iPageItem = i;
			return;
		}
	}
	SMenuActiveStatus[iMenuNo].iPageItem = 0;
	return;
	
}


/*
 *   功能: 显示主菜单
 *   入口: 当前选择项号 
 */
int	DispMainMenu(wWin, iCurrItem)
WINDOW	*wWin;
int	iCurrItem;
{
	int	i;
	int	iLen;
	int	iMenuItem;
	char	sBuf[256];

	iLen = 0;
	for (i = 0; i < MAXITEM; i++) {
		iMenuItem = SMenu[0].iMenuItemSet[i];
		if (iMenuItem == -1)
			break;
		if (iLen < strlen(SMenuItem[iMenuItem].sName));
			iLen = strlen(SMenuItem[iMenuItem].sName);
	}
	if (iLen % 2 != 0)
		iLen++;

	for (i = 0; i < MAXITEM; i++) {
		iMenuItem = SMenu[0].iMenuItemSet[i];
		if (iMenuItem == -1)
			break;
		wmove(wWin, 2, iLen + i * 4);
		DispItem0(wWin, SMenu[0].iMenuItemSet[i], (iCurrItem == i));
	}
	wmove(wWin, 3, 0);
	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);
		}
	}
	wrefresh(wWin);
	return(0);

⌨️ 快捷键说明

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