?? winstr.c
字號:
#include "../def/window.h"#include <ctype.h>/***** 函數: 行式菜單**** 返回: 菜單項編號, 首項為0.最后一項為退出*/int linemenu(win, y, msgwin,y1,x1,menu, count, dqxz)WINDOW *win; /*窗口指針*/short y; /*菜單顯示行*/WINDOW *msgwin; /*幫助窗口指針*/short y1, x1; /*幫助欄起始坐標*/int count; /*菜單項數*/ int dqxz; /*當前選項*/char *menu[]; /*菜單字符串數組指針*/ { int sy[30],i,len,k,lenstart,choice = 0; short f, b, c; char key[30]; len = 0; for (i = 0; i < count; i++) { sy[i] = len; len = len + strlen(menu[i]) + 2; key[i]=menu[i][0]; if(!isalnum(key[i])) { disperror(msgwin,y1,x1,"菜單選擇項應是數字或字母!"); return(0); } } choice=dqxz; if((sy[choice]+strlen(menu[choice]+2)>win->_maxx)){ lenstart=sy[choice]; k=choice;} else{lenstart=0;k=0;} clearmsg(msgwin,y1,x1, 60); while(1){ for(i=2;i<win->_maxx-2;i++){ mvwaddch(win,y,i,' '); mvwaddch(win,y+1,i,'_');} for(i=k;(i<count)&&((sy[i]+strlen(menu[i])+2-lenstart)<win->_maxx);i++){ wmove(win,y,sy[i]-lenstart+2); waddstr(win,menu[i]); } wrefresh(win); wstandout(win); mvwaddstr(win, y, sy[choice]-lenstart+2, menu[choice]); wrefresh(win); wstandend(win); c = wacckey(win) ; clearmsg(msgwin,y1,x1, 60); for(i=0;i<=count;i++) if(key[i]==c) break; if(i<count) { choice = i;k=i;lenstart=sy[i];} else { switch (c) { case RET: case LF : wstandout(win); wmove(win, y, sy[choice]-lenstart+2); waddstr(win, menu[choice]); wrefresh(win); wstandend(win); return(choice); break; case KEY_LEFT: if(k==choice){ choice--; if (choice < 0) choice = count - 1; lenstart=sy[choice];k=choice; } else choice--; break; case KEY_RIGHT: choice++; if (choice == count){ choice = 0; lenstart=sy[0];k=0;} else if(sy[choice]+strlen(menu[choice])+4 > win->_maxx+lenstart){ for(i=0;i<choice;i++) if(sy[choice]+strlen(menu[choice])+4-sy[i]<win->_maxx)break; lenstart=sy[i];k=i; } break; default: printf("\007"); break; } } }}/***** 函數: 彈出式菜單**** 返回: 菜單項編號, 首項為0.*/pop_menu(win, y, x, msgwin, y1, x1, menu, count, dqxz)WINDOW *win; /*窗口指針*/short y, x; /*菜單起始坐標*/WINDOW *msgwin; /*幫助窗口指針*/short y1, x1; /*幫助欄起始坐標*/char *menu[]; /*菜單字符串數組指針*/int count; /*菜單項數*/int dqxz; /*當前選項*/{ int i, choice, choices; short f, b, c; char key[25]; if (count > win->_maxy - y - 2) choices = win->_maxy - y - 2; else choices = count; for (i = 0; i < choices; i++) { key[i]=menu[i][0]; if(!isalnum(key[i])) { disperror(msgwin,y1,x1,"菜單選擇項應是數字或字母!"); return(0); } mvwprintw(win, i + y, x, "%s", menu[i]); } wrefresh(win); choice = dqxz; getcolor(win, f, b); for (; ; ) { wsetcolor(win, b, f); mvwaddstr(win, choice + y, x, menu[choice]); wrefresh(win); wsetcolor(win, f, b); wrefresh(win); c = wacckey(win); clearmsg(msgwin,y1,x1,60); if (isalnum(c)) { mvwaddstr(win, choice + y, x, menu[choice]); wrefresh(win); } for(i=0;i<=count;i++) if(key[i]==c) break; if(i<count) choice = i; else { switch (c) { case RET: case LF: return(choice); break; case KEY_DOWN: case KEY_RIGHT: mvwaddstr(win, choice + y, x, menu[choice]); wrefresh(win); choice++; if (choice > (count - 1)) choice = 0; break; case KEY_UP: case KEY_LEFT: mvwaddstr(win, choice + y, x, menu[choice]); wrefresh(win); choice--; if (choice < 0) choice = count - 1; break; default: printf("\007"); break; } } }}/***** 函數: 在win上接收用戶鍵值(標準屏win用stdscr)**** 返回: 鍵值.*/wacckey(win)WINDOW *win;{ short c; raw(); c = wgetch(win); if (c == CTRL_F) { c = wgetch(win); switch (c) { case '1': return(KEY_F(1)); case '2': return(KEY_F(2)); case '3': return(KEY_F(3)); case '4': return(KEY_F(4)); default : return(c); } } else if (c == ESC) { c = wgetch(win); if (c == SQUARE) { c = wgetch(win); switch (c) { case 'A': return(KEY_UP); case 'B': return(KEY_DOWN); case 'C': return(KEY_RIGHT); case 'D': return(KEY_LEFT); case 'I': return(PAGE_UP); case 'G': return(PAGE_DOWN); case 'F': return(End); default : return(ERR); } } else return(c); } else return(c);}/***** 函數: 劃中文制表符邊框***/pbox(swin)WINDOW *swin; /*窗口指針*/{ int i; short y, x; y = swin->_maxy; x = swin->_maxx; for (i = 0; i <= (y - 1); i++) { if (i == 0) { mvwaddstr(swin, i , 0, "┌"); mvwaddstr(swin, i , x - 2, "┐"); } else if (i == (y - 1)) { mvwaddstr(swin, i , 0, "└"); mvwaddstr(swin, i , x - 2, "┘"); } else { mvwaddstr(swin, i , 0, "│"); mvwaddstr(swin, i , x - 2, "│"); } } for (i = 2; i < x - 2; i += 2) { mvwaddstr(swin, 0 , i, "─"); mvwaddstr(swin, y - 1 , i, "─"); } wrefresh(swin); return(0);}pbox_f(swin,f,b)WINDOW *swin; /*窗口指針*/int f, b; /*色值*/{ int i,j; short y, x; y = swin->_maxy; x = swin->_maxx; wsetcolor(swin, f, b); for (i = 0; i <= (y - 1); i++) { for (j = 0; j <= x - 2; j += 2) { if ( i == 0 ) { if (j==0) mvwaddstr(swin, i , j, "┌"); else if (j == ( x-2 ) ) mvwaddstr(swin, i , j, "┐"); else mvwaddstr(swin, i , j,"─"); } else if (i == (y - 1)) { if (j==0) mvwaddstr(swin, i , j, "└"); else if ( j == ( x-2 ) ) mvwaddstr(swin, i , j, "┘"); else mvwaddstr(swin, i , j,"─"); } else if ( j==0 ) mvwaddstr(swin, i , j, "│"); else if ( j==(x-2) ) mvwaddstr(swin, i , j, "│"); else mvwaddstr(swin, i , j, " "); } } wrefresh(swin); return(0);}/***** 函數: 給窗口填色.***/fillcolor(swin, fc, bc)WINDOW *swin; /*窗口指針*/int fc, bc;/*色值*/{ int i, j; short y, x; y = swin->_maxy; x = swin->_maxx; wsetcolor(swin, fc, bc); for (i = 0; i <= y; i++) for (j = 0; j <= x; j++) mvwaddch(swin, i, j, ' '); wrefresh(swin); return(0);}/***** 函數: 彈出棧頂窗口.***/pop(){ int i, j, k; short *p; top--; /* 彈出棧頂窗口 */ curwin = stack[top]; /* 當前窗口指針指向棧頂窗口 */ if (top == 0) { /* 恢復彈出后的棧頂窗口 */ p = (short *)calloc(LINES * COLS, sizeof(short)); k = 0; for (i = 0; i < LINES; i++) for (j = 0; j < COLS; j++) p[k++] = stdscr->_y[i][j]; k = 0; clear(); refresh(); for (i = 0; i < LINES; i++) { for (j = 0; j < COLS; j++) stdscr->_y[i][j] = p[k++]; stdscr->_firstch[i] = 0; stdscr->_lastch[i] = COLS - 1; } refresh(); free(p); /* 棧頂窗口是 stdscr */ } else { touchwin(curwin); wrefresh(curwin); }}/***** 函數: 把窗口壓入堆棧. ***/push(win)WINDOW *win; /*窗口指針*/{ int i; wclear(win); wrefresh(win); /* 清除窗口 */ top++; stack[top] = win; /* 窗口壓入堆棧 */ curwin = win; /* 當前窗口指針指向棧頂窗口 */}/***** 函數: 恢復指定窗口后面的屏幕.***/restore_win(){ WINDOW * ptr; /* 窗口指示指針 */ int i, j, k; short *p; /* 暫存 stdscr 內容的變量 */ p = (short *)calloc(LINES * COLS, sizeof(short));/*給暫存變量分配空間 */ k = 0; for (i = 0; i < LINES; i++) for (j = 0; j < COLS; j++) p[k++] = stdscr->_y[i][j]; /* 讀取 stdscr 的內容 */ k = 0; clear(); refresh(); for (i = 0; i < LINES; i++) { for (j = 0; j < COLS; j++) stdscr->_y[i][j] = p[k++]; stdscr->_firstch[i] = 0; stdscr->_lastch[i] = COLS - 1; } /* 恢復 stdscr 的內容 */ refresh(); free(p); i = 1; while (i <= top) { /* 恢復窗口堆棧中的其他窗口 */ ptr = stack[i]; touchwin(ptr); wrefresh(ptr); i++; }}/***** 函數: 恢復stdscr部分屏幕.***/restore_bfscr(y, x, y1, x1)short y, x; /*行列大小*/short y1, x1; /*起始坐標*/{ int i, j, k; short *p; /* 暫存 stdscr 內容的變量 */ p = (short *)calloc(y * x, sizeof(short));/*暫存變量分配空間 */ k = 0; for (i = y1; i < (y1 + y); i++) for (j = x1; j < (x1 + x); j++) p[k++] = stdscr->_y[i][j]; /* 讀取 stdscr 的內容 */ k = 0; for (i = y1; i < (y1 + y); i++) { for (j = x1; j < (x1 + x); j++) stdscr->_y[i][j] = p[k++]; stdscr->_firstch[i] = 0; stdscr->_lastch[i] = COLS - 1; } /* 恢復 stdscr 的內容 */ refresh(); free(p);}/***** 函數: 接收密碼鍵值***/acc_pwd(win, y, x, str, l)WINDOW *win; /*窗口*/short y, x; /*行,列*/short l; /*串長*/char *str; /*接收串*/{ short c, m, i; char *p; mvwaddstr(win, y - 1, x, " "); wrefresh(win); p = str; m = i = 0; do { mvwaddstr(win, y - 1, x, " "); mvwaddstr(win, y - 1, x + m, "
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -