📄 win_util.c
字号:
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 + -