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 + -
显示快捷键?