📄 disp_menu.c
字号:
}
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 + -