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

📄 win_util.c

📁 API
💻 C
📖 第 1 页 / 共 2 页
字号:

	for (i = 2; i < COLS-2; i++)
		mvwprintw(header_win, 0, i, " ");

	mvwprintw(header_win, 0, 0, "【%04d】", tx_code);

	wattron(header_win, A_REVERSE);
	sprintf(format, "%%%ds", (int)strlen(tx_name));
	mvwprintw(header_win, 0, 8, format, tx_name);
	wattroff(header_win, A_REVERSE);

	zut_win_disp_opname1(header_win, GV_opcode, GV_opname);

	zut_get_ymdhms(&y, &m, &d, &hh, &mm, &ss);
	mvwprintw(header_win, 0, 64, "%04d年%02d月%02d日", y, m, d);
	wrefresh(header_win);

}

zut_win_disp_opname1(w, opcode, opname)
WINDOW	*w;
short	opcode;
char	*opname;
{
	mvwprintw(w, 0, 44, "柜员: ");
	if (opcode == 0)
		mvwprintw(w, 0, 50, "%4s", " ");
	else
		mvwprintw(w, 0, 50, "%04d", opcode);
	mvwprintw(w, 0, 55, "%-8s", opname);
	wrefresh(w);
}

zut_win_disp_title(w, title)
WINDOW	*w;
char	*title;
{
	int	j;
	int	title_row = HEADER_ROWS-1;

	for (j = 0; j < COLS/2; j++)
		mvwprintw(w, title_row, j*2, "%s", GV_sign_char);
	mvwprintw(w, title_row, ((COLS-(int)strlen(GV_title))/2-1)/2*2, GV_title);
	wrefresh(w);
}

zut_win_disp_copyright(w, copyright)
WINDOW	*w;
char	*copyright;
{
	int	j;
	int	copyright_row = w->_maxy-PROMPT_ROWS;

	for (j = 0; j < COLS/2; j++)
		mvwprintw(w, copyright_row, j*2, "%s", GV_sign_char);
	mvwprintw(w, copyright_row, ((COLS-(int)strlen(GV_copyright))/2-1)/2*2, GV_copyright);
	wrefresh(w);
}

#endif	//zgx010508
/*
 *	弹出警告窗口
 *	一行原因串r_str, 一行建议解决方法串s_str
 */
zut_win_warning(r_str, s_str)
char	*r_str;
char	*s_str;
{
	int	i, j;
	int	c;
	WINDOW	*warn_w;
	int	cols;
	int	len;

	beep();
	len = (int)strlen(r_str);
	if (len < (int)strlen(s_str))
		len = (int)strlen(s_str);
	if (len > 40)
		len = 40;

	cols = (len+1)/2 * 2;
	if (cols <= 6)
		cols = 6;
	warn_w = newwin(6, cols+8+2, 10, (COLS-(cols+8+2))/2);
	keypad(warn_w, TRUE);
	zut_win_draw_hcbox(warn_w, 6, cols+8, 0, 0);
	mvwprintw(warn_w, 1, 4, "警告: ");
	wattron(warn_w, A_REVERSE);
	mvwprintw(warn_w, 3, 4, r_str);
	wattroff(warn_w, A_REVERSE);
	wattron(warn_w, A_BOLD);
	mvwprintw(warn_w, 4, 4, s_str);
	wattroff(warn_w, A_BOLD);
	c = wgetch(warn_w);
	delwin(warn_w);
#ifdef zgx980508 /*正式运行版不可强行退出 */
	if (c == KEY_F(1)) /* 强行退出 */
		return(-1);	
#endif
	return(0);
}


zut_scr_error(w, str1, str2)
WINDOW	*w;
char	*str1, *str2;
{
#ifdef WXBC
	zut_win_err_prompt(w, WORKAREA_SROW+WORKAREA_ROWS-2, str1);
	zut_win_disp_prompt(w, WORKAREA_SROW+WORKAREA_ROWS-2, str2);
#else
	zut_err_prompt(w, str1);
	zut_disp_prompt(w, str2);
#endif


}

#ifdef zgx010508_del
/*
 * 显示大写金额串
 */
disp_upper(w, x, y, label, fee)
WINDOW	*w;
int	x, y;
char	label[];
double	fee;
{
	int	i, len;
	char	*upper_str();
	char	ustr[128];

	strcpy(ustr, upper_str(fee));
	for (i = y; i < COLS-2-y; i++)
		mvwprintw(w, x, i, " ");
	mvwprintw(w, x, y, "%s%s", label, ustr);
	wrefresh(w);
}

set_opname(opcode, opname)
short	opcode;
char	*opname;
{
	
	strcpy(GV_opname, opname);
/*zgx980831
	GV_opcode = opcode;
*/
	sprintf(GV_opcode, "%04d", opcode);
	zut_win_disp_opname(stdscr, opcode, opname);

}

/*
 * 弹出一窗口, 将item_str中以分隔符sepchar分隔的各项显示其中供选择
 * 返回选出的串在item_str中的序号(不算空项)
 */
zut_win_select(item_str, sepchar, item_title, sel_str, one_only)
char	*item_str;
char	sepchar;
char	*item_title;
char	*sel_str;
char	one_only;
{
	int	i, j, k;
	int	c;
	int	oi;
	int	item_cnt;
	int	max_str_len;
	short	rows, cols, srow, scol;
	int	item_rows;
	int	item_cols;
	int	each_len;
	int	order;
	WINDOW	*box_w;
	WINDOW	*item_w;
	int	page, page_total, page_items, max_items;
	int	v_int;
/*
	char	**item_tab;
*/
	struct	item_st {
		short	ord;
		char	str[128];
	}	**item_tab;
	short	tem_ord, max_ord;
	char	sub_str[256];

	v_int = (int)strlen(item_str);
	if (v_int == 0) {
		return(-1);	/* 无任何项 */
	} else {
		if (item_str[v_int-1] != sepchar) {
			/* 加上最后一个分隔符 */
			item_str[v_int++] = sepchar;
			item_str[v_int] = '\0';
		}
		v_int = zut_get_seperate(item_str, sepchar);
		item_tab = (struct item_st **)malloc(v_int * sizeof(struct item_st * ));
		if (item_tab == NULL) {
			return(-2);	/* 内存分配错 */
		}
		max_ord = 1;
		item_cnt = 0;
		max_str_len = 0;
		for (i = 0; i < v_int; i++) {
			zut_get_fld(item_str, i, sub_str, sepchar);
			if ((int)strlen(zut_trunc_lr_space(sub_str)) == 0)
				continue;	/* 跳过全空的项 */
			item_tab[item_cnt] = (struct item_st *)malloc(sizeof(struct item_st ));
			if (item_tab[item_cnt] == NULL) {
				for (j = 0; j < item_cnt; j++)
					free(item_tab[j]);
				free(item_tab);
				return(-2);	/* 内存分配错 */
			}
			item_tab[item_cnt]->ord = 0;
			strcpy(item_tab[item_cnt]->str, sub_str);
			if (max_str_len < (int)strlen(sub_str))
				max_str_len = strlen(sub_str);
			item_cnt++;
		}
		if (item_cnt == 0) {
			free(item_tab);
			return(-1);	/* 无任何项 */
		}
	}
	
	each_len = 2+max_str_len + 4;

	rows = VIEW_ROWS-4;
	if (max_str_len < 40)
		cols = 40 + 20;
	else
		cols = each_len + 8;
	srow = VIEW_SROW+2;
	scol = COLS - cols - 8;
	box_w = newwin(rows+2, cols+4, srow-1, scol-2);
	zut_win_wboxclear(box_w, TRUE);
	/*
	 *	显示标题于box_w之顶端
	 */
	wattron(box_w, A_BOLD);
	mvwprintw(box_w, 0, ((box_w->_maxx - (int)strlen(item_title))/2+1)/2*2, item_title);
	wattroff(box_w, A_BOLD);
	wrefresh(box_w);

	item_w = newwin(rows, cols, srow, scol);
	keypad(item_w, TRUE);
	wrefresh(item_w);

	item_rows = item_w->_maxy - 2;	/* 每屏显示行数 */
	item_cols = (item_w->_maxx - 8) / each_len; /* 显示列数 */

	page_items = item_rows * item_cols;
	page_total = (item_cnt-1) / page_items + 1;


	page = 0;
	i = 0;

	c = KEY_DOWN;

bb:
	order = page * page_items;
	if (page == page_total - 1)
		max_items = (item_cnt-1) % page_items + 1;
	else
		max_items =  page_items;

	for (j = 0; j < max_items; j++) {
		wmove(item_w, 1+j % item_rows, 4 + (j / item_rows) * each_len);
		if (item_tab[j+order]->ord > 0)
			wprintw(item_w, "%-2d%-.*s", item_tab[j+order]->ord, max_str_len, item_tab[j+order]->str);
		else
			wprintw(item_w, "  %-.*s", max_str_len, item_tab[j+order]->str);
	}
	for (; j < page_items; j++) {
		wmove(item_w, 1 + j % item_rows, 4 + (j / item_rows) * each_len);
		wprintw(item_w, "%*s", each_len, " ");
	}
	
	wstandout(item_w);
	wmove(item_w, 1 + i % item_rows, 4 + (i / item_rows) * each_len);
	if (item_tab[i+order]->ord > 0)
		wprintw(item_w, "%-2d%-.*s", item_tab[i+order]->ord, max_str_len, item_tab[i+order]->str);
	else
		wprintw(item_w, "  %-.*s", max_str_len, item_tab[i+order]->str);
	wstandend(item_w);
	wrefresh(item_w);

	while(1) {
/*
		touchwin(item_w);
		wrefresh(item_w);
*/
		oi = i;
		switch((c = wgetch(item_w))) {
		case	'\n':
		case	'\r':
		case	KEY_F(2):
		case	KEY_F(3):
			if (one_only == 1) {	/* 单选 */
				strcpy(sel_str, item_tab[i+order]->str);
				strcat(sel_str, "|");
				for (j = 0; j < item_cnt; j++)
					free(item_tab[j]);
				free(item_tab);
				delwin(item_w);
				delwin(box_w);
				return(0);
			}
			if (item_tab[i+order]->ord == 0) {
				item_tab[i+order]->ord = max_ord++;
				wstandout(item_w);
				wmove(item_w, 1 + i % item_rows, 4 + (i / item_rows) * each_len);
				wprintw(item_w, "%-2d%-.*s", item_tab[i+order]->ord, max_str_len, item_tab[i+order]->str);
				wstandend(item_w);
				continue;
			}
			tem_ord = item_tab[i+order]->ord;
			item_tab[i+order]->ord = 0;
			max_ord--;
			for (j = 0; j < item_cnt; j++) {
				if (item_tab[j]->ord > tem_ord)
					item_tab[j]->ord--;
			}
			for (j = 0; j < max_items; j++) {
				wmove(item_w, 1+j % item_rows, 4 + (j / item_rows) * each_len);
				if (item_tab[j+order]->ord > 0)
					wprintw(item_w, "%-2d%-.*s", item_tab[j+order]->ord, max_str_len, item_tab[j+order]->str);
				else
					wprintw(item_w, "  %-.*s", max_str_len, item_tab[j+order]->str);
			}
			for (; j < page_items; j++) {
				wmove(item_w, 1 + j % item_rows, 4 + (j / item_rows) * each_len);
				wprintw(item_w, "%*s", each_len, " ");
			}
			wstandout(item_w);
			wmove(item_w, 1 + i % item_rows, 4 + (i / item_rows) * each_len);
			wprintw(item_w, "  %-.*s", max_str_len, item_tab[i+order]->str);
			wstandend(item_w);
			continue;
		case	KEY_DOWN:
			if (i == max_items-1) {
				if (i+order != item_cnt - 1) {
					page++;
				} else {
					page = 0;
				}
				i = 0;
				goto bb;
			} else
				i++;
			break;
		case	KEY_UP:
			if (i == 0) {
				if (order != 0) {
					page--;
					i = page_items-1;
				} else {
					page = page_total-1;
#ifdef zgx980227
					i = item_cnt % page_items - 1;
#else
					if (item_cnt % page_items == 0)
						i = page_items -1;
					else
						i = item_cnt % page_items - 1;
#endif
				}
				goto bb;
			} else
				i--;
			break;
		case	KEY_RIGHT:
			if (i/item_rows == (max_items-1)/item_rows)
				i = i%item_rows;
			else
				i += item_rows;
			break;
		case	KEY_LEFT:
			if (i/item_rows == 0)
				i += ((max_items-1)/item_rows)*item_rows;
			else
				i -= item_rows;
			break;
		case	KEY_F(1):
		case	'\033':
			sel_str[0] = '\0';
			for (k = 1; k < max_ord; k++) {
				for (j = 0; j < item_cnt; j++) {
					if (item_tab[j]->ord == k) {
						strcat(sel_str, item_tab[j]->str);
						strcat(sel_str, "|");
						break;
					}
				}
			}
			for (j = 0; j < item_cnt; j++)
				free(item_tab[j]);
			free(item_tab);
			delwin(item_w);
			delwin(box_w);
			return(0);

		default:
			beep();
			continue;
		}
		if (i >= max_items)
			i = max_items - 1;
		if (oi != i) {
			wstandend(item_w);
			wmove(item_w, 1 + oi % item_rows, 4 + (oi / item_rows) * each_len);
			if (item_tab[oi+order]->ord)
				wprintw(item_w, "%-2d%-.*s", item_tab[oi+order]->ord, max_str_len, item_tab[oi+order]->str);
			else
				wprintw(item_w, "  %-.*s", max_str_len, item_tab[oi+order]->str);
			wstandout(item_w);
			wmove(item_w, 1 + i % item_rows, 4 + (i / item_rows) * each_len);
			if (item_tab[i+order]->ord)
				wprintw(item_w, "%-2d%-.*s", item_tab[i+order]->ord, max_str_len, item_tab[i+order]->str);
			else
				wprintw(item_w, "  %-.*s", max_str_len, item_tab[i+order]->str);
			wstandend(item_w);
		}
		wrefresh(item_w);
	}
}

/*
 *	在row,col处弹出一个窗口接收输入 lim 个字符到数组 str[],
 *	若bf为TRUE则须加框, 否则不加.
 *	屏幕显示从 x, y 开始, 用[]包括, 括号数不含于 lim 中
 */
zut_pop_input(row, col, label, lim, str, bf)
short	row, col;
char	*label;
int	lim;
char	*str;
bool	bf;
{
	char	prompt[128];
	WINDOW	*w;
	short	zrows, zcols;
	short	x, y;
	int	ret;

	if (bf) {
		zcols = ((int)strlen(label) + lim + 4 + 4 + 1)/2*2;
		zrows = 3;
	} else {
		zcols = ((int)strlen(label) + lim + 2 + 2 + 1)/2*2;
		zrows = 1;
	}
	w = newwin(zrows, zcols, row, col);
	if (bf)
		zut_win_draw_cbox(w, zrows, zcols, 0, 0, TRUE);
	prompt[0] = '\0';
	if (bf) {
		x = 1;
		y = 4 + (int)strlen(label);
	} else {
		x = 0;
		y = 2 + (int)strlen(label);
	}
	mvwprintw(w, x, 2, "%s", label);
	ret = zut_win_char_input(w, x, y, lim, 'k', str, prompt);
	delwin(w);
	return(ret);
}
#endif	//zgx010508_del

/*
 * 响铃若干秒钟
 */
jmp_buf	beeppos;
char	beep_flag = 0;

warn_beep(sec)
int	sec;
{
	void	beepstop();

	beep_flag = 0;
	setjmp(beeppos);
	if (beep_flag == 1)
		return;
	signal(SIGALRM, beepstop);
	alarm(sec);
	while (1)
		beep();
}

void beepstop()
{

	alarm(0);
	signal(SIGALRM, SIG_IGN);
	beep_flag = 1;
	longjmp(beeppos, 1);
}

⌨️ 快捷键说明

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