📄 wininit.c
字号:
#include "../def/window.h"#include <ctype.h>/*** 功能: 用RECORD结构产生屏幕*/initform(view,lf,rf,yfg)RECORD *view;char lf,rf;short yfg;{ short j, i, y, x; for (i = 0; i < view->nu; i++) { y = view->field[i]->y; if(view->field[i]->dflag==YES) { x = view->field[i]->x - strlen(view->field[i]->name)-yfg; mvwaddstr(view->win, y, x, view->field[i]->name); } x = view->field[i]->x - 1; mvwaddch(view->win, y, x, lf); for (j = 0; j < view->field[i]->dlen; j++) mvwaddch(view->win, y, view->field[i]->x + j, ' '); x = view->field[i]->x + view->field[i]->dlen; mvwaddch(view->win, y, x, rf); *(view->field[i]->buf_i)=0; *(view->field[i]->buf_d)=0; view->field[i]->buf_s[0]='\0'; view->field[i]->upbuf[0]='\0'; } wrefresh(view->win); view->dqnu=0; view->recend=NO;}clearform(view)RECORD *view;{ short j, i, y; for (i = 0; i < view->nu; i++) { y = view->field[i]->y; for (j = 0; j < view->field[i]->dlen; j++) mvwaddch(view->win, y, view->field[i]->x + j, ' '); *(view->field[i]->buf_i)=0; *(view->field[i]->buf_d)=0; view->field[i]->buf_s[0]='\0'; view->field[i]->upbuf[0]='\0'; } wrefresh(view->win); view->dqnu=0; view->recend=NO;}clearwork(bp,y,x,ny,nx)RECORD *bp;short y, x,ny,nx;{ short i, j; for(i=0;i<ny;i++) for(j=0;j<nx;j++) mvwaddch(bp->win, y + i, x + j, ' '); wrefresh(bp->win);}gbfdef(view,lb,nu,str)RECORD *view;short lb,nu;char *str;{if(nu>view->nu-1){ puts("域数error!!"); return(0);}switch(lb) { case A_DEF: if ( ( view->field[nu]->def = str ) != ZCP ) { view->field[nu]->def = (char *)malloc(81); strcpy(view->field[nu]->def, str); } else strcpy(view->field[nu]->def, str); return(1); break; case A_HELP: if ( ( view->field[nu]->help = str ) != ZCP ) { view->field[nu]->help = (char *)malloc(81); strcpy(view->field[nu]->help, str); } else strcpy(view->field[nu]->help, str); return(1); break; default: puts("无效属性类别!!"); return(0); break; }}gbreclb(view,lb,fun)RECORD *view;short lb;int (*fun)();{ if(lb>0&&lb<4){ view->reclb=lb; if((lb==UP)||(lb==UP)){ view->dqnu=0; view->recend=NO; } if(fun!=0) view->fun=fun; return(1); } puts("无效属性类别!!"); return(0);}attri(view,lb,nu)RECORD *view;short lb,nu;{if(nu>view->nu-1){ puts("域数error!!"); return(0);}switch(lb) { case F_FLAG: view->field[nu]->flag=NO; return(1); break; case F_DFLAG: view->field[nu]->dflag=NO; return(1); break; case F_UNFLAG: view->field[nu]->nuflag=NO; return(1); break; case F_UPDATE: view->field[nu]->update=NO; return(1); break; case G_FLAG: view->field[nu]->flag=YES; return(1); break; case G_DFLAG: view->field[nu]->dflag=YES; return(1); break; case G_UNFLAG: view->field[nu]->nuflag=YES; return(1); break; case G_UPDATE: view->field[nu]->update=YES; return(1); break; default: puts("无效属性类别!!"); return(0); break; }}/* * 记录初始化 */RECORD *initrec( win, msgwin, f, b, tab_rec,msgy,msgx)WINDOW *win,*msgwin;int f; /* 当前域前景 */int b; /* 当前域背景 */char *tab_rec;short msgy,msgx;{ RECORD *bp; register int i; bp = ( RECORD *)malloc(sizeof( RECORD )); if ( bp == ZBP ) { puts("分配内存溢出 !!!"); return(0); } bp->reclb=0; bp->win=win; bp->msgwin=msgwin; bp->nu = 0; bp->dqnu = 0; bp->recend = NO; bp->f = f; bp->b = b; if ( ( bp->tab_rec = tab_rec ) != ZCP ) { bp->tab_rec = ( char *)malloc(strlen(tab_rec) + 1); strcpy(bp->tab_rec, tab_rec); } bp->dpmaxbs=0; bp->msgy=msgy; bp->msgx=msgx; i = 0; while ( i < NBFIELD ) bp->field[i++] = ZFP; return( bp );}/* * STR域初始化 */initfield_s(bp, name, tab_fie, type, begy, begx, len, dlen, fun, funstr)RECORD *bp;/* 块指针 */char *name; /* 域名 */char *tab_fie; /* 对应数据库表字段 */int type; /* 域类别 */int begy; /* 起始光标行 */int begx; /* 起始光标列 */int len; /* 域长度 */int dlen; /* 显示域长度 */int (*fun)();char *funstr; /* 程序变量 */{ int i; register FIELD *fp; fp = ( FIELD *)malloc(sizeof( FIELD )); if ( fp == ZFP ) { puts("分配域描述符内存溢出 !!!"); return(0); } if ( ( fp->name = name ) != ZCP ) { fp->name = ( char *)malloc(strlen(name) + 1); strcpy(fp->name, name); } if ( ( fp->tab_fie = tab_fie ) != ZCP ) { fp->tab_fie = ( char *)malloc(strlen(tab_fie) + 1); strcpy(fp->tab_fie, tab_fie); } fp->type = type; fp->y = begy; fp->x = begx; if ( len < 1 ) { puts("出错: 域长度必须大于 0 !!!"); return(0); } if ( type == DAT1 ) fp->len=10; else if ( type == DAT2 ) fp->len=8; else fp->len = len; fp->scale = 0; if ( dlen < len ) { puts("出错: 显示域长度必须大于域长!!!"); return(0); } fp->dlen = dlen; fp->buf_s = (char *)malloc((fp->len) + 1); if ( fp->buf_s == ZCP ) { puts("STR分配域编辑缓冲区内存溢出 !!!"); return(0); } fp->buf_s[fp->len] = '\0'; fp->buf_i = (int *)malloc(sizeof(int)); if ( fp->buf_i == ZIP ) { puts("INT分配域编辑缓冲区内存溢出 !!!"); return(0); } fp->buf_d = (double *)malloc(sizeof(double)); if ( fp->buf_d == ZDP ) { puts("DOUBLE分配域编辑缓冲区内存溢出 !!!"); return(0); } if (funstr!=0) fp->buf_s=funstr; fp->upbuf = (char *)malloc((fp->len) + 1); if ( fp->upbuf == ZCP ) { puts("分配域修改缓冲区内存溢出 !!!"); return(0); } fp->upbuf[fp->len] = '\0'; fp->fun = fun; fp->def = 0; fp->help = 0; fp->flag = YES; fp->dflag = YES; fp->nuflag = YES; fp->update = YES; bp->nu++; if ( bp->nu > NBFIELD ) { puts("域数分配error!!!"); return(0); } bp->field[bp->nu-1] = fp; return( 1 );}/* * INT域初始化 */initfield_i(bp, name, tab_fie, type, begy, begx, len, dlen, fun, funint)RECORD *bp;/* 块指针 */char *name; /* 域名 */char *tab_fie; /* 对应数据库表字段 */int type; /* 域类别 */int begy; /* 起始光标行 */int begx; /* 起始光标列 */int len; /* 域长度 */int dlen; /* 域长度 */int (*fun)();int *funint; { int i; register FIELD *fp; fp = ( FIELD *)malloc(sizeof( FIELD )); if ( fp == ZFP ) { puts("分配域描述符内存溢出 !!!"); return(0); } if ( ( fp->name = name ) != ZCP ) { fp->name = ( char *)malloc(strlen(name) + 1); strcpy(fp->name, name); } if ( ( fp->tab_fie = tab_fie ) != ZCP ) { fp->tab_fie = ( char *)malloc(strlen(tab_fie) + 1); strcpy(fp->tab_fie, tab_fie); } fp->type = type; fp->y = begy; fp->x = begx; if ( len < 1 ) { puts("出错: 域长度必须大于 0 !!!"); return(0); } fp->len = len; fp->scale = 0; if ( dlen < len ) { puts("出错: 显示域长度必须大于域长!!!"); return(0); } fp->dlen = dlen; fp->buf_s = (char *)malloc((fp->len) + 1); if ( fp->buf_s == ZCP ) { puts("STR分配域编辑缓冲区内存溢出 !!!"); return(0); } fp->buf_s[fp->len] = '\0'; fp->buf_i = (int *)malloc(sizeof(int)); if ( fp->buf_i == ZIP ) { puts("INT分配域编辑缓冲区内存溢出 !!!"); return(0); } fp->buf_d = (double *)malloc(sizeof(double)); if ( fp->buf_d == ZDP ) { puts("DOUBLE分配域编辑缓冲区内存溢出 !!!"); return(0); } if(funint!=0) fp->buf_i=funint; fp->upbuf = (char *)malloc((fp->len) + 1); if ( fp->upbuf == ZCP ) { puts("分配域修改缓冲区内存溢出 !!!"); return(0); } fp->upbuf[fp->len] = '\0'; fp->fun = fun; fp->def = 0; fp->help = 0; fp->flag = YES; fp->dflag = YES; fp->nuflag = YES; fp->update = YES; bp->nu++; if ( bp->nu > NBFIELD ) { puts("域数分配error!!!"); return(0); } bp->field[bp->nu-1] = fp; return( 1 );}/* * DOUBLE域初始化 */initfield_d(bp, name, tab_fie, type, begy, begx, len, scale, dlen, fun, fundou)RECORD *bp;/* 块指针 */char *name; /* 域名 */char *tab_fie; /* 对应数据库表字段 */int type; /* 域类别 */int begy; /* 起始光标行 */int begx; /* 起始光标列 */int len; /* 域长度 */int scale; /* 小数位数 */int dlen; /* 域长度 */int (*fun)();double *fundou;{ int i; register FIELD *fp; fp = ( FIELD *)malloc(sizeof( FIELD )); if ( fp == ZFP ) { puts("分配域描述符内存溢出 !!!"); return(0); } if ( ( fp->name = name ) != ZCP ) { fp->name = ( char *)malloc(strlen(name) + 1); strcpy(fp->name, name); } if ( ( fp->tab_fie = tab_fie ) != ZCP ) { fp->tab_fie = ( char *)malloc(strlen(tab_fie) + 1); strcpy(fp->tab_fie, tab_fie); } fp->type = type; fp->y = begy; fp->x = begx; if ( len < 1 ) { puts("出错: 域长度必须大于 0 !!!"); return(0); } if ( type == UDOU || type == DOUB ) { if ( len > 12 ) { puts("出错:域长度不能大于12 !!!"); return(0); } } if ( scale < 0 ) scale = 0; if ( type == UDOU || type == DOUB ) { if ( scale >= len ) { puts("出错:小数位溢出 !!!"); return(0); } } fp->len = len; fp->scale = scale; if ( dlen < len ) { puts("出错: 显示域长度必须大于域长!!!"); return(0); } fp->dlen = dlen; fp->buf_s = (char *)malloc((fp->len) + 1); if ( fp->buf_s == ZCP ) { puts("分配域编辑缓冲区内存溢出 !!!"); return(0); } fp->buf_s[fp->len] = '\0'; fp->buf_i = (int *)malloc(sizeof(int)); if ( fp->buf_i == ZIP ) { puts("INT分配域编辑缓冲区内存溢出 !!!"); return(0); } fp->buf_d = (double *)malloc(sizeof(double)); if ( fp->buf_d == ZDP ) { puts("DOUBLE分配域编辑缓冲区内存溢出 !!!"); return(0); } if(fundou!=0) fp->buf_d=fundou; fp->upbuf = (char *)malloc((fp->len) + 1); if ( fp->upbuf == ZCP ) { puts("分配域修改缓冲区内存溢出 !!!"); return(0); } fp->upbuf[fp->len] = '\0'; fp->fun = fun; fp->def = 0; fp->help = 0; fp->flag = YES; fp->dflag = YES; fp->nuflag = YES; fp->update = YES; bp->nu++; if ( bp->nu > NBFIELD ) { puts("域数分配error!!!"); return(0); } bp->field[bp->nu-1] = fp; return( 1 );}initdbform(bp,maxbs)RECORD *bp;int maxbs;{ int i,k[15],j[15],c,d,m,n; bp->dpmaxbs=maxbs; k[0]=0; for(i=0,c=0;i<bp->nu;i++) { if((bp->field[i]->dlen)>=strlen(bp->field[i]->name)) { if((bp->field[i]->dlen)%2==0) k[i+1]=bp->field[i]->dlen+c+2; else k[i+1]=bp->field[i]->dlen+c+3; } else { if(strlen(bp->field[i]->name)%2==0) k[i+1]=strlen(bp->field[i]->name)+c+2; else k[i+1]=strlen(bp->field[i]->name)+c+3; } c=k[i+1]; j[i]=(c-k[i]-strlen(bp->field[i]->name))/2+k[i]+1; } for(d=0;d<=bp->dpmaxbs+3;d++) { for(m=0,n=0;m<=c;m+=2) { if( m==0) { if(d==0) mvwaddstr(bp->win,d,m,"┌"); else if(d==2) mvwaddstr(bp->win,d,m,"├"); else if(d==bp->dpmaxbs+3) mvwaddstr(bp->win,d,m,"└"); else mvwaddstr(bp->win,d,m,"│"); } else if( m==k[i]) { if (d==0) mvwaddstr(bp->win,d,m,"┐"); else if(d==2) mvwaddstr(bp->win,d,m,"┤"); else if(d==bp->dpmaxbs+3) mvwaddstr(bp->win,d,m,"┘"); else mvwaddstr(bp->win,d,m,"│"); } else if( m==k[n+1]) { if (d==0) mvwaddstr(bp->win,d,m,"┬"); else if(d==2) mvwaddstr(bp->win,d,m,"┼"); else if(d==bp->dpmaxbs+3) mvwaddstr(bp->win,d,m,"┴"); else mvwaddstr(bp->win,d,m,"│"); n++; } else { if ( d==0 || d== 2 || d==bp->dpmaxbs+3 ) mvwaddstr(bp->win,d,m,"─"); else mvwaddstr(bp->win,d,m," "); } } } for(m=0;m<bp->nu;m++) { mvwaddstr(bp->win,1,j[m],bp->field[m]->name); *(bp->field[m]->buf_i)=0; *(bp->field[m]->buf_d)=0.00; bp->field[m]->buf_s[0]='\0'; bp->field[m]->upbuf[0]='\0'; } wrefresh(bp->win); return( 0 );}/* * 菜单域初始化 */initpopfd(bp, menu, count, begy, begx)RECORD *bp; /* 块指针 */char *menu[]; /*菜单字符串数组指针*/ int count; /*菜单项数*/ int begy; /* 起始光标行 */int begx; /* 起始光标列 */{ int i; for(i=0;i<count;i++) initfield_s(bp, menu[i], 0, STR, begy+i, begx, 1, strlen(menu[i]),0,0); return( 1 );}initlinefd(bp, menu, count, begy)RECORD *bp; /* 块指针 */char *menu[]; /*菜单字符串数组指针*/ int count; /*菜单项数*/ int begy; /* 起始光标行 */{ int sy[20], i, len = 0; for (i = 0; i < count; i++) { sy[i] = len; len = len + strlen(menu[i]) + 2; } len = (bp->win->_maxx - len) / 2; for (i = 0; i < count; i++) sy[i] = sy[i] + len; for(i=0;i<count;i++) initfield_s(bp, menu[i], 0, STR, begy, sy[i], 1, strlen(menu[i]),0,0); return( 1 );}inityufun(bp, nu, fun)RECORD *bp; /* 块指针 */short nu; int (*fun)();{ bp->field[nu]->fun=fun; return( 1 );}menu_win(bp)RECORD *bp;{ int i, choice; short f, b, c; char key[25]; choice = bp->nu; for (i = 0; i < choice; i++) { key[i]=bp->field[i]->name[0]; if(!isalnum(key[i])) { dperror(bp,"菜单选择项应是数字或字母!"); return(0); } dispbuf(bp, i, bp->field[i]->name); } choice = 0; getcolor(bp->win, f, b); for (; ; ) { wstandout(bp->win); dispbuf(bp, choice, bp->field[choice]->name); wstandend(bp->win); c = wacckey(bp->win); clmsg(bp,60); if (isalnum(c)) dispbuf(bp, choice, bp->field[choice]->name); for(i=0;i<=bp->nu;i++) if(key[i]==c) break; if(i<bp->nu) choice = i; else { switch (c) { case RET: case LF: if (choice == ( bp->nu - 1 )) return(EXIT); if(bp->field[choice]->fun!=0) bp->field[choice]->fun(bp); break; case KEY_DOWN: case KEY_RIGHT: dispbuf(bp, choice, bp->field[choice]->name); choice++; if (choice > (bp->nu - 1)) choice = 0; break; case KEY_UP: case KEY_LEFT: dispbuf(bp, choice, bp->field[choice]->name); choice--; if (choice < 0) choice = bp->nu - 1; break; default: printf("\007"); break; } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -