📄 viewbox.c
字号:
#include <curses.h>#include <panel.h>#include "screen.h"#include "viewbox.h"void ViewPad(WINDOW *pad, FILE *fp){ int i = 0; char buf[1024]; wclear(pad); memset(buf, 0, sizeof(buf)); while(fscanf(fp, "%[^\n]\n", buf) != EOF) { mvwaddstr(pad, i, 0, buf); i++; }}void ViewMove(WINDOW *pad, int *pos, int row){ char buf[1024]; mvwinstr(pad, *pos, 0, buf); mvwaddstr(pad, *pos, 0, buf); *pos = row; wattron(pad, A_REVERSE); mvwinstr(pad, *pos, 0, buf); mvwaddstr(pad, *pos, 0, buf); wattroff(pad, A_REVERSE); wmove(pad, *pos, 0);}/* pos-光标位置 start-显示起始行 end-显示终止行 length-总记录数*/void ViewNext(WINDOW *pad, int *pos, int *start, int *end, int length){ if(*pos == length - 1) return; if(*pos == *end ) { *start = *start + 1; *end = *end +1; } ViewMove(pad, pos, *pos + 1);}void ViewPrev(WINDOW *pad, int *pos, int *start, int *end, int length){ char buf[1024]; int i; if(*pos == 0) return; if(*pos == *start) { *start = *start - 1; *end = *end - 1; } ViewMove(pad, pos, *pos - 1);}void ViewNextPage(WINDOW *pad, int *pos, int *start, int *end, int length){ int len = *end - *start + 1; if(*end == length - 1) return; if(*end + len >= length - 1) len = length -1 - *end; *start = *start +len; *end = *end +len; ViewMove(pad, pos, *pos + len);}void ViewPrevPage(WINDOW *pad, int *pos, int *start, int *end, int length){ int len = *end - *start + 1; if(*start == 0) return; if(*start - len < 0 ) len = *start; *start = *start - len; *end = *end - len; ViewMove(pad, pos, *pos - len);}int ViewBox(int y, int x, int rows, int cols, char *name, char *title, char *fname){ PANEL *panel; WINDOW *titlepad, *contentpad, *mainwin; int width = 0, length = 0; FILE *fp; char buf[1024]; char msg[80]; int pos = 0, c, col = 0; int start, end; int flag = 1; if((fp = fopen(fname, "r")) == NULL) { memset(msg, 0, sizeof(msg)); sprintf(msg, "打开文件[%s]错误", fname); PrintMsg(stdscr, msg, 'E'); deleteln(); refresh(); return(-1); } memset(buf, 0, sizeof(buf)); while((fscanf(fp, "%[^\n]\n", buf) != EOF)) { length++; if(strlen(buf) > width) width = strlen(buf); } if( length == 0) { PrintMsg(stdscr, "查询不到相应记录", 'R'); deleteln(); refresh(); fclose(fp); return(-1); } if(mainwin = newwin(rows, cols, y, x)) { //建立新窗口 if((panel = new_panel(mainwin)) == NULL) { //窗口与屏面关联 fprintf(stderr, "%s|%d|建立查询屏幕失败!", __FILE__, __LINE__); fclose(fp); return(-1); } keypad(mainwin, TRUE); } else { fprintf(stderr, "%s|%d|%建立查询窗口失败!", __FILE__, __LINE__); fclose(fp); return(-1); } if((titlepad = newpad(1, width)) == NULL){ fprintf(stderr, "%s|%d|%建立表头窗口失败!", __FILE__, __LINE__); fclose(fp); delwin(mainwin); del_panel(panel); return(-1); } if((contentpad = newpad(length, width)) == NULL){ fprintf(stderr, "%s|%d|%建立内容窗口失败!", __FILE__, __LINE__); fclose(fp); delwin(mainwin); delwin(titlepad); del_panel(panel); return(-1); } Dialog(mainwin, name); mvwprintw(mainwin, rows - 2, 1, "提示:Enter-确认 ESC-退出 N-下一页 P-上一页 B-右移8列 F-左移8列 "); wrefresh(mainwin); wattron(titlepad, A_BOLD); mvwaddstr(titlepad, 0, 0, title); rewind(fp); ViewPad(contentpad, fp); ViewMove(contentpad, &pos, 0); start = 0; end = rows - 6; do { if(flag == 1) prefresh(titlepad, 0, col, y+1, x+1, y+2, cols); prefresh(contentpad, start, col, y+2, x+1, y + rows -4, cols); c = wgetch(mainwin); switch(c) { case KEY_RIGHT: col++; if (col > width - cols + 2) col = width - cols +2; flag = 1; break; case KEY_LEFT: col--; if(col < 0 ) col = 0; flag = 1; break; case 'b': case 'B': case 0x02://Ctrl + B col += 8; if (col > width - cols + 2) col = width - cols + 2; flag = 1; break; case 'f': case 'F': case 0x06://Ctrl + F col -= 8; if(col < 0 ) col = 0; flag = 1; break; case KEY_DOWN: ViewNext(contentpad, &pos, &start, &end, length); flag = 0; break; case KEY_UP: ViewPrev(contentpad, &pos, &start, &end, length); flag = 0; break; case 'n': case 'N': case 0x0e://Ctrl + N ViewNextPage(contentpad, &pos, &start, &end, length); flag = 0; break; case 'p': case 'P': case 0x10://Ctrl + P ViewPrevPage(contentpad, &pos, &start, &end, length); flag = 0; break; default: break; } }while(c != 0x1b);//ESC delwin(titlepad); delwin(contentpad); delwin(mainwin); del_panel(panel); }/*main(){ char title[1024]; memset(title, 0, sizeof(title)); StartScreen(); sprintf(title,"付款行行号类型付款行行号类型付款行行号类型付款行行号类型付款行行号类型%-40s %-60s %-20s %-10s", "账号", "户名", "金额", "利率"); ViewBox(2, 2, 22, 76, "[测试程序]" ,title, "test"); EndScreen();}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -