📄 curlib.c
字号:
disp_sysbox(strbuf);}/*----------------------------------------------------------------------------* * Function: 显示一个消息窗口. * Argument: * short sy - 消息框的开始行. * short sx - 消息框的开始列. * char *msg - 消息文本. * char *title - 标题文本. * chtype flag - MSG_OK, MSG_OC, MSG_YN, MSG_YNC, MSG_RC, MSG_ARI. * Return : * TRUE. *----------------------------------------------------------------------------*/disp_box(uchar sy,uchar sx,char *msg,char *title,chtype flag){ message_box(sy,sx,msg,title,flag,screen.wstyle,screen.text,screen.board,screen.select,screen.title); return(TRUE);}/*----------------------------------------------------------------------------* * Function: 显示一个消息框(stdscr). * Argument: * short sy - 消息框的开始行. * short sx - 消息框的开始列. * char *msg - 消息文本. * char *title - 标题文本. * chtype flag - MSG_OK, MSG_OC, MSG_YN, MSG_YNC, MSG_RC, MSG_ARI. * chtype style - 窗口风格: WINDOW_SHADE, WINDOW_CHINESE. * chtype tattr - 正文颜色. * chtype battr - 边框颜色. * chtype sattr - 选项颜色. * chtype hattr - 标题颜色. * Return : * TRUE. *----------------------------------------------------------------------------*/int message_box(uchar sy,uchar sx,char *msg,char *heading,chtype flag,chtype style,chtype tattr,chtype battr,chtype sattr,chtype hattr){ int item_num,lines,i,ret,len,loop,tlen,tx; uchar ch; uchar row,col; WINDOW *txtwin; window_t *win; msgcmd_t *ptr,*newptr,*headptr; col = 10; row = get_item_num(msg,'\n'); if( row == 0 ) { if( strlen(msg) > col ) col = strlen(msg); row = 1; } else { for(i=0;i<row;i++) { if( strlen(get_item(msg,'\n',i)) > col ) col = strlen(get_item(msg,'\n',i)); } } col++; if( style & WINDOW_CHINESE ) { if( col % 2 != 0 ) col++; } if( col > 74 ) col = 74; tlen = strlen(heading); if( tlen > col ) tlen = col; if( (win = create_window(sy,sx,(uchar)(row+2),col,tattr,battr,style)) == NULL ) { return -1; } show_window(win); attron(battr); wdraw_line(stdscr,win->sy+row+1,win->sx,win->col,style); attroff(battr); /* Display title */ if( *heading != 0 ) { tx = (win->col-tlen)/2; if( (tx % 2) != 0 ) tx--; else tx-=2; aprint(win->sy,win->sx+tx,hattr,heading); } if( style & WINDOW_CHINESE ) { if( (txtwin=subwin(stdscr,row,col,win->sy+1,win->sx+2)) == NULL ) { return -1; } } else { if( (txtwin=subwin(stdscr,row,col,win->sy+1,win->sx+1)) == NULL ) { return -1; } } /* Display message text */ wcls(txtwin,tattr); mvwaddstr(txtwin,0,0,msg); touchwin(txtwin); wrefresh(txtwin); if( (newptr=(msgcmd_t *)malloc(sizeof(msgcmd_t))) == NULL ) { return -1; } memset(newptr,'\0',sizeof(msgcmd_t)); headptr = newptr; switch(flag) { case MSG_OC: newptr->id = ID_OK; if( screen.wstyle & WINDOW_CHINESE ) { strcpy(newptr->text,"[确认]"); newptr->coord = col/2-6; } else { strcpy(newptr->text,"[OK]"); newptr->coord = col/2-4; } if( (newptr=(msgcmd_t *)malloc(sizeof(msgcmd_t))) == NULL ) { return -1; } memset(newptr,'\0',sizeof(msgcmd_t)); newptr->id = ID_CANCEL; if( screen.wstyle & WINDOW_CHINESE ) { strcpy(newptr->text,"[取消]"); newptr->coord = col/2+2; } else { strcpy(newptr->text,"[CANCEL]"); newptr->coord = col/2+2; } newptr->next = headptr; newptr->prev = headptr; headptr->next = newptr; headptr->prev = newptr; item_num = 2; break; case MSG_YN: newptr->id = ID_OK; if( screen.wstyle & WINDOW_CHINESE ) { strcpy(newptr->text,"[是]"); newptr->coord = col/2-4; } else { strcpy(newptr->text,"[YES]"); newptr->coord = col/2-4; } if( (newptr=(msgcmd_t *)malloc(sizeof(msgcmd_t))) == NULL ) { return -1; } memset(newptr,'\0',sizeof(msgcmd_t)); newptr->id = ID_CANCEL; if( screen.wstyle & WINDOW_CHINESE ) { strcpy(newptr->text,"[否]"); newptr->coord = col/2+2; } else { strcpy(newptr->text,"[NO]"); newptr->coord = col/2+2; } newptr->next = headptr; newptr->prev = headptr; headptr->next = newptr; headptr->prev = newptr; item_num = 2; break; case MSG_RC: newptr->id = ID_RETRY; if( screen.wstyle & WINDOW_CHINESE ) { strcpy(newptr->text,"[重试]"); newptr->coord = col/2-6; } else { strcpy(newptr->text,"[RETRY]"); newptr->coord = col/2-4; } if( (newptr=(msgcmd_t *)malloc(sizeof(msgcmd_t))) == NULL ) { return -1; } memset(newptr,'\0',sizeof(msgcmd_t)); newptr->id = ID_CANCEL; if( screen.wstyle & WINDOW_CHINESE ) { strcpy(newptr->text,"[取消]"); newptr->coord = col/2+2; } else { strcpy(newptr->text,"[CANCEL]"); newptr->coord = col/2+2; } newptr->next = headptr; newptr->prev = headptr; headptr->next = newptr; headptr->prev = newptr; item_num = 2; break; case MSG_YNC: newptr->id = ID_YES; if( screen.wstyle & WINDOW_CHINESE ) { strcpy(newptr->text,"[是]"); newptr->coord = col/2-8; } else { strcpy(newptr->text,"[YES]"); newptr->coord = col/2-10; } ptr=newptr; if( (newptr=(msgcmd_t *)malloc(sizeof(msgcmd_t))) == NULL ) { return -1; } memset(newptr,'\0',sizeof(msgcmd_t)); newptr->id = ID_NO; if( screen.wstyle & WINDOW_CHINESE ) { strcpy(newptr->text,"[否]"); newptr->coord = col/2-1; } else { strcpy(newptr->text,"[NO]"); newptr->coord = col/2-1; } ptr->next = newptr; newptr->prev = ptr; ptr=newptr; if( (newptr=(msgcmd_t *)malloc(sizeof(msgcmd_t))) == NULL ) { return -1; } memset(newptr,'\0',sizeof(msgcmd_t)); newptr->id = ID_CANCEL; if( screen.wstyle & WINDOW_CHINESE ) { strcpy(newptr->text,"[取消]"); newptr->coord = col/2+6; } else { strcpy(newptr->text,"[CANCEL]"); newptr->coord = col/2+7; } ptr->next = newptr; newptr->prev = ptr; newptr->next = headptr; headptr->prev = newptr; item_num = 3; break; case MSG_ARI: newptr->id = ID_ABORT; if( screen.wstyle & WINDOW_CHINESE ) { strcpy(newptr->text,"[放弃]"); newptr->coord = col/2-11; } else { strcpy(newptr->text,"[ABORT]"); newptr->coord = col/2-11; } ptr=newptr; if( (newptr=(msgcmd_t *)malloc(sizeof(msgcmd_t))) == NULL ) { return -1; } memset(newptr,'\0',sizeof(msgcmd_t)); newptr->id = ID_RETRY; if( screen.wstyle & WINDOW_CHINESE ) { strcpy(newptr->text,"[重试]"); newptr->coord = col/2-2; } else { strcpy(newptr->text,"[RETRY]"); newptr->coord = col/2-2; } ptr->next = newptr; newptr->prev = ptr; ptr=newptr; if( (newptr=(msgcmd_t *)malloc(sizeof(msgcmd_t))) == NULL ) { return -1; } memset(newptr,'\0',sizeof(msgcmd_t)); newptr->id = ID_IGNORE; if( screen.wstyle & WINDOW_CHINESE ) { strcpy(newptr->text,"[忽略]"); newptr->coord = col/2+7; } else { strcpy(newptr->text,"[IGNORE]"); newptr->coord = col/2+7; } ptr->next = newptr; newptr->prev = ptr; newptr->next = headptr; headptr->prev = newptr; item_num = 3; break; case MSG_OK: newptr->id = ID_OK; if( screen.wstyle & WINDOW_CHINESE ) { strcpy(newptr->text,"[确认]"); newptr->coord = col/2-2; } else { strcpy(newptr->text,"[OK]"); newptr->coord = col/2; } newptr->next = newptr; newptr->prev = newptr; item_num = 1; break; case MSG_AK: default: newptr->id = ID_ANYKEY; if( screen.wstyle & WINDOW_CHINESE ) { strcpy(newptr->text,"[按任意键]"); newptr->coord = col/2-4; } else { strcpy(newptr->text,"[ANY KEY]"); newptr->coord = col/2-4; } newptr->next = newptr; newptr->prev = newptr; item_num = 1; break; } /* Display item */ if( style & WINDOW_CHINESE ) { cls_line(win->sy+row+2,win->sx+2,col,battr); } else { cls_line(win->sy+row+2,win->sx+1,col,battr); } ptr=headptr; do { mvwaddstr(stdscr,win->sy+row+2,win->sx+ptr->coord,ptr->text); ptr=ptr->next; } while( ptr != headptr); touchwin(stdscr); wrefresh(stdscr); ptr=headptr; //if( (flag == MSG_AK) || (flag == 0) || (item_num == 1) ) if( (flag == MSG_AK) || (flag == 0) ) { aprint(win->sy+row+2,win->sx+ptr->coord,sattr,ptr->text); get_char(); ret = ptr->id; } else { loop=TRUE; while(loop) { aprint(win->sy+row+2,win->sx+ptr->coord,sattr,ptr->text); switch(get_funckey(&ch)) { case KeyEnter: ret=ptr->id; loop=FALSE; break; case KeyDown: case KeyRight: aprint(win->sy+row+2,win->sx+ptr->coord,tattr,ptr->text); ptr=ptr->next; break; case KeyUp: case KeyLeft: aprint(win->sy+row+2,win->sx+ptr->coord,tattr,ptr->text); ptr=ptr->prev; break; default: beep(); } /* end of switch */ } /* end of while */ } delwin(txtwin); delete_window(win); touchwin(stdscr); wrefresh(stdscr); if( headptr->next != NULL ) free(headptr->next); if( headptr->prev != NULL ) free(headptr->next); if( headptr != NULL ) free(headptr); return ret;}/*----------------------------------------------------------------------------* * Function: 显示一个消息窗口(使用WINDOW). * Argument: * short sy - 消息框的开始行. * short sx - 消息框的开始列. * char *msg - 消息文本. * char *heading - 标题文本. * chtype flag - MSG_OK, MSG_OC, MSG_YN, MSG_YNC, MSG_RC, MSG_ARI. * chtype style - 窗口风格: WINDOW_SHADE, WINDOW_CHINESE. * chtype tattr - 正文颜色. * chtype battr - 边框颜色. * chtype sattr - 选项颜色. * chtype hattr - 标题颜色. * Return : * TRUE. *----------------------------------------------------------------------------*/int message_win(short sy,short sx,char *msg,char *heading,chtype flag,chtype style,chtype tattr,chtype battr,chtype sattr,chtype hattr){ int item_num,lines,i,ret,len,loop,tlen,tx; uchar ch; short wrow,wcol,trow,tcol; WINDOW *win,*txtwin; msgcmd_t *ptr,*newptr,*headptr; len = 20; lines = get_item_num(msg,'\n'); if( lines == 0 ) { if( strlen(msg) > len ) len = strlen(msg); lines = 1; } else { for(i=0;i<lines;i++) { if( strlen(get_item(msg,'\n',i)) > len ) len = strlen(get_item(msg,'\n',i)); } } if( (len % 2) != 0 ) len++; else len+=2; if( len > 74 ) len = 74; if( style & WINDOW_SHADE ) { wrow = 5+lines; wcol = 6+len; trow = lines; tcol = wcol - 6; } else { wrow = 4+lines; wcol = 4+len; trow = lines; tcol = wcol - 4; } tlen = strlen(heading); if( tlen > tcol ) tlen = tcol; if( (win = newwin(wrow,wcol,sy,sx)) == NULL ) { return -1; } wdraw_box(win,tattr,battr,style); wattron(win,battr);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -