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

📄 viewbox.c

📁 sco unix 前台界面开发程序,采用UNIX中的词法分析器和语法分析器
💻 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 + -