win_select.old.ec

来自「在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便」· EC 代码 · 共 774 行 · 第 1/2 页

EC
774
字号
		wrefresh(w);
		switch (wgetch(w)) {
		case	KEY_UP:
		case	KEY_LEFT:
			if (i == 0) {
				if (fst_recno == 1) {
					beep();
					wattron(w, A_REVERSE);
					mvwprintw(w, win_lines, 0, "%-*s", win_cols, "已到第一条.  ");
					wattroff(w, A_REVERSE);
					continue;
				}
				fst_recno--;
				redraw = 1;
			} else
				i--;
			break;
		case	KEY_DOWN:
		case	KEY_RIGHT:
			if (fst_recno + i == max_recno) {
				beep();
				wattron(w, A_REVERSE);
				mvwprintw(w, win_lines, 0, "%-*s", win_cols, "已到最后一条.");
				wattroff(w, A_REVERSE);
				continue;
			}
			if (i == win_lines-1) {
				if (fst_recno+win_lines-1 == max_recno) {
					beep();
					wattron(w, A_REVERSE);
					mvwprintw(w, win_lines, 0, "%-*s", win_cols, "已到最后一条.");
					wattroff(w, A_REVERSE);
					continue;
				}
				fst_recno++;
				redraw = 1;
			} else
				i++;
			break;
#ifdef STAR500
		case	KEY_F(12):
#else
		case	KEY_PPAGE:
#endif
			if (fst_recno == 1) {
				beep();
				wattron(w, A_REVERSE);
				mvwprintw(w, win_lines, 0, "%-*s", win_cols, "已到第一页.  ");
				wattroff(w, A_REVERSE);
				continue;
			}
			fst_recno -= win_lines;
			if (fst_recno <= 0)
				fst_recno = 1;
/*
			i = 0;
*/
			redraw = 1;
			break;
#ifdef STAR500
		case	KEY_F(13):
#else
		case	KEY_NPAGE:
#endif
			if (fst_recno + win_lines >= max_recno) {
				beep();
				wattron(w, A_REVERSE);
				mvwprintw(w, win_lines, 0, "%-*s", win_cols, "已到最后一页.");
				wattroff(w, A_REVERSE);
				continue;
			}
			fst_recno += win_lines;
			if (i + fst_recno >= max_recno) {
				/* 最后一页调整i */
				i = max_recno - fst_recno;
			}
			redraw = 1;
			break;
		case	KEY_F(4):
		case	'\n':
		case	'\r':
/*================== WuBin 2001-6-22 10:39 ======Start==============*/
			tmp_recno = fst_recno+i;
			$fetch absolute $tmp_recno inquery_cur_select into :code, :name;
/*===========================2001-6-22 10:39=======End==============*/
			$close inquery_cur_select;
			DelSpace(name);
			sel_code = code;
			strcpy(sel_name, name);
			delwin(w);
			delwin(boxw);
			scr_restore ( scr_dump_file );
			unlink ( scr_dump_file );
			return(0);
		case	'\033':
			$close inquery_cur_select;
			sel_code = 0;
			strcpy(sel_name, "");
			delwin(w);
			delwin(boxw);
			scr_restore ( scr_dump_file );
			unlink ( scr_dump_file );
			return(-1);
		default:
			beep();
			continue;
		}
		mvwprintw(w, win_lines, 0, "%-*s", win_cols, " ");
		mvwprintw(w, oi, 0, "  ");
		wrefresh(w);
		oi = i;
		if (redraw == 0) {
			continue;
		}
		for (j = 0; j < win_lines; j++) {
			tmp_recno = fst_recno + j;
			$fetch absolute $tmp_recno inquery_cur_select into :code, :name;
			if (SQLCODE) {
				mvwprintw(w, j, 0, "%-*s", win_cols, " ");
				continue;
			}
			mvwprintw(w, j, 2, "%-*d", code_len, code);
			mvwprintw(w, j, 2+code_len+2, "-*%s", name_len, name);
			redraw = 0;
		}
	}
}

/*
 * 弹出查询窗口进行选择
 * 每个记录需三个字段,一般为number,chinese,macro_def,一般只用前两个字段
 * bit_struct的位图结构在bitmap.h中定义
 * Added Wubin
 * ZGX--Move from ../XXX_ADM/pubname.c
 */
int bitmap_select(bit_map, bit_struct )
char 	*bit_map;		/* 所要选择的位图名 */
struct 	bitmap_struct 	*bit_struct;	/* 所要选择的位图名的结构名称 */
{
	char	*bit_flag;

	char	bit_number[3];			/* 标号   	 */
	char	bit_chinese[30];		/* 中文描述   */
	char	bit_macro_def[30];		/* 对应宏定义 */
	int	number_len = 0, chinese_len = 0;
	char	scr_dump_file[80];

	int	c, cc;
	WINDOW	*w, *boxw;
	int	row, col, srow, scol;
	
	int	ii, i, j, oi;
	int	win_lines, win_cols;
	char	redraw = 0;
	int	max_recno;
	int	tmp_recno;
	int	fst_recno;


	/*
	 * 计算总记录数,及number,chinese的最大长度,以便确定窗口大小
	 */
	max_recno = 0;
	i = 0;
	while (1) {
		if (bit_struct[i].number[0] == '\0')
			break;
		max_recno ++;
		DelSpace(bit_struct[i].number);
		if (strlen(bit_struct[i].number) > number_len)
			number_len = strlen(bit_struct[i].number);
		DelSpace(bit_struct[i].chinese);
		if (strlen(bit_struct[i].chinese) > chinese_len)
			chinese_len = strlen(bit_struct[i].chinese);
		i ++;
	}
	
	if (max_recno == 0) {
		return(-2);
	}
#ifdef zgx020506_modi
	bit_flag = (char *)malloc((max_recno > strlen(bit_map))?(max_recno + 1):(strlen(bit_map)+1));
	if (bit_flag == NULL) {
		return(-1);
	}
#else
	/* 将未填满的bit_map[]补满, 以便与bit_struct中定义的一致 */
	for (i = strlen(bit_map); i < max_recno; i++) {
		bit_map[i] = '0';
	}
	bit_map[i] = '\0';
	max_recno = strlen(bit_map);

	bit_flag = (char *)malloc(max_recno + 1);
	if (bit_flag == NULL) {
		return(-1);
	}
#endif
	for (i = 0; i < max_recno; i++) {	/* 初始化标记位图选择标志位 */
		bit_flag[i]='1';
	}
	for (i = 0; ((i < strlen(bit_map))|| (i < max_recno)); i++)
		if (bit_map[i] == '0' || bit_map[i] == '1')
			bit_flag[i] = bit_map[i];

	if (chinese_len % 2)	/* 使其为偶数 */
		chinese_len ++;
	win_cols = chinese_len + number_len + 2 + 2 + 2 + 2;
                                                       /* ^ 选择标记 "√"*/
	if (win_cols < 16)
		win_cols = 16;
	if (win_cols > COLS - 12) {
		free(bit_flag);
		return(-3);
	}
	win_lines = 8;
	srow = 5;
	scol = COLS - win_cols - 8;

	

	sprintf( scr_dump_file, "/tmp/.bitmap_select.%d", getpid() );
	scr_dump ( scr_dump_file );

	boxw = newwin(win_lines+2+2, win_cols+4, srow-1, scol-2);
	w = newwin(win_lines+2, win_cols, srow, scol);

	zut_win_wboxclear(boxw, 1);
	wrefresh(boxw);

	for (i = 0; i < win_lines; i++) {
		
		DelSpace(bit_struct[i].number);
		DelSpace(bit_struct[i].chinese);

		mvwprintw(w, i, 0, "%-2s", (bit_flag[i] =='0')?"  ":"√");
		mvwprintw(w, i, 4, "%-*s", number_len, bit_struct[i].number);
		mvwprintw(w, i, 4+number_len+2, "%-*s", chinese_len, bit_struct[i].chinese);
	}

	mvwprintw(w, win_lines+1, 2, "%-*s", win_cols, "↑↓移动 空格选择 回车退出");

	i = 0;

	mvwprintw(w, i, 2, "→");
	oi = 0;
	fst_recno = 1;
	redraw = 0;
	keypad(w, TRUE);
	while (1) {
		mvwprintw(w, i, 2, "→");
		wrefresh(w);
		switch (wgetch(w)) {
		case	KEY_UP:
		case	KEY_LEFT:
			if (i == 0) {
				if (fst_recno == 1) {
					beep();
					wattron(w, A_REVERSE);
					mvwprintw(w, win_lines, 0, "%-*s", win_cols, "已到第一条.  ");
					wattroff(w, A_REVERSE);
					continue;
				}
				fst_recno--;
				redraw = 1;
			} else
				i--;
			break;
		case	KEY_DOWN:
		case	KEY_RIGHT:
			if (fst_recno + i == max_recno) {
				beep();
				wattron(w, A_REVERSE);
				mvwprintw(w, win_lines, 0, "%-*s", win_cols, "已到最后一条.");
				wattroff(w, A_REVERSE);
				continue;
			}
			if (i == win_lines-1) {
				if (fst_recno+win_lines-1 == max_recno) {
					beep();
					wattron(w, A_REVERSE);
					mvwprintw(w, win_lines, 0, "%-*s", win_cols, "已到最后一条.");
					wattroff(w, A_REVERSE);
					continue;
				}
				fst_recno++;
				redraw = 1;
			} else
				i++;
			break;
#ifdef STAR500
		case	KEY_F(12):
#else
		case	KEY_PPAGE:
#endif
			if (fst_recno == 1) {
				beep();
				wattron(w, A_REVERSE);
				mvwprintw(w, win_lines, 0, "%-*s", win_cols, "已到第一页.  ");
				wattroff(w, A_REVERSE);
				continue;
			}
			fst_recno -= win_lines;
			if (fst_recno <= 0)
				fst_recno = 1;
/*
			i = 0;
*/
			redraw = 1;
			break;
#ifdef STAR500
		case	KEY_F(13):
#else
		case	KEY_NPAGE:
#endif
			if (fst_recno + win_lines >= max_recno) {
				beep();
				wattron(w, A_REVERSE);
				mvwprintw(w, win_lines, 0, "%-*s", win_cols, "已到最后一页.");
				wattroff(w, A_REVERSE);
				continue;
			}
			fst_recno += win_lines;
			if (i + fst_recno >= max_recno) {
				/* 最后一页调整i */
				i = max_recno - fst_recno;
			}
/*
			i = 0;
*/
			redraw = 1;
			break;
		case	'\040':
			if (bit_flag[fst_recno+i-1] == '0') {
				bit_flag[fst_recno+i-1] = '1';
				mvwprintw(w, i, 0, "%-2s", "√");
			} else if (bit_flag[fst_recno+i-1] == '1') {
				bit_flag[fst_recno+i-1] = '0';
				mvwprintw(w, i, 0, "%-2s", "  ");
			}
			break;
		case	KEY_F(4):
		case	'\n':
		case	'\r':
			for (ii = 0; ii < max_recno; ii++) {	/* 返回bitmap值 */
				bit_map[ii] = bit_flag[ii];
			}
			bit_map[ii] = '\0';
			free(bit_flag);
			delwin(w);
			delwin(boxw);
			scr_restore ( scr_dump_file );
			unlink ( scr_dump_file );
			return(0);
		case	'\033':
			free(bit_flag);
			delwin(w);
			delwin(boxw);
			scr_restore ( scr_dump_file );
			unlink ( scr_dump_file );
			return(-1);
		default:
			beep();
			continue;
		}
		mvwprintw(w, win_lines, 0, "%-*s", win_cols, " ");
		mvwprintw(w, oi, 2, "  ");
		wrefresh(w);
		oi = i;
		if (redraw == 0) {
			continue;
		}
		for (j = 0; j < win_lines; j++) {
			tmp_recno = fst_recno + j - 1;
			if (tmp_recno > max_recno - 1) {
				mvwprintw(w, j, 0, "%-*s", win_cols, " ");
				continue;
			}
			mvwprintw(w, j, 0, "%-2s", (bit_flag[tmp_recno]=='0')?"  ":"√");
			mvwprintw(w, j, 4, "%-*s", number_len, bit_struct[tmp_recno].number);
			mvwprintw(w, j, 4+number_len+2, "%-*s", chinese_len, bit_struct[tmp_recno].chinese);
			redraw = 0;
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?