📄 input.c
字号:
#include <ctype.h>
#include <curses.h>
#include <string.h>
#include <sys/stat.h>
#include <time.h>
#include <stdlib.h>
#include <tam/kcodes.h>
#include "INPUT.h"
void xxts_for_input(char *str)
{
char buff[100];
WINDOW *win;
win=newwin(3,80,21,0);
box(win,0,0);
wstandend(win); //关闭反显
mvwprintw(win,1,2,"%s","〖提示信息〗 ");
//mvwprintw(win,1,59,"%s","(ctrl_w提交,ESC返回)");
mvwprintw(win,1,15,"%s",str);
touchwin(win);
wrefresh(win);
delwin(win);
}
/*
**功能: 单域内的字符串输入,供函数INPUT()调用
**返回: 0 ctrl+w; 1 ->,enter; -1 <-,删除键; 27 ESC;
*/
int Input(win,input_field,item_no)
WINDOW *win;
INPUT_FIELD * input_field;
int item_no;
{
int ret;
int i; //记数器:已输入的字符个数
int ch; //临时存放输入的字符
int cur; //当前光标位置
char * repeat_ch( char,int);
int check_day(char *str,char ch);
xxts_for_input(input_field[item_no].tsxx);
wstandout(win); //打开反显
sprintf(input_field[item_no].val,"%-s",input_field[item_no].qs);
i=strlen((input_field[item_no].val));
cur=i;
if(input_field[item_no].type=='p')
mvwprintw(win,input_field[item_no].row,input_field[item_no].col,"%s",repeat_ch('*',strlen((input_field[item_no].val))) );
else
mvwprintw(win,input_field[item_no].row,input_field[item_no].col,"%s",(input_field[item_no].val));//显示缺省字符串
//若有外挂输入函数,则从外挂函数中取值
if( (input_field[item_no].input_from_dev_fun)!=((int)0) ){
int iii=0;
repeat1:
while( (input_field[item_no].input_from_dev_fun)(input_field[item_no].val)!=0 );
for( iii=input_field[item_no].col;iii<input_field[item_no].col+input_field[item_no].maxlen;iii++)
mvwprintw(win,input_field[item_no].row,iii,"%s"," ");
//显示输入字符串
if(input_field[item_no].type=='p')
mvwprintw(win,input_field[item_no].row,input_field[item_no].col,"%s",repeat_ch('*',strlen((input_field[item_no].val))) );
else
mvwprintw(win,input_field[item_no].row,input_field[item_no].col,"%s",(input_field[item_no].val));
touchwin(win);
wrefresh(win);
//校验输入值
if( (input_field[item_no].chk_fun)!=((int)0) ){
wstandend(win); //关闭反显
if( (input_field[item_no].chk_fun)(input_field[item_no].val)!=0 ) {
wstandout(win); //打开反显
goto repeat1;
}
}
return(1);
}
//若有弹出数组,则从数组中选值
if( input_field[item_no].pop_item>0 && input_field[item_no].pop_array[0]!=NULL ){
int row=input_field[item_no].row+2;
int col=input_field[item_no].col;
int max_len=0,iii;
char tmp_pop_buff[80];
memset(tmp_pop_buff,0,80);
//取数组最长行的长度
for(iii=0;iii<input_field[item_no].pop_item;iii++){
if( strlen(input_field[item_no].pop_array[iii]) > max_len )
max_len=strlen(input_field[item_no].pop_array[iii]);
}
//计算显示起始座标
{
int y,x;
getmaxyx(win,y,x);
if( row+input_field[item_no].pop_item>y-1 )
row=y-input_field[item_no].pop_item-1;
if( col+max_len>x-2 )
col=x-max_len-2;
}
repeat2:
//弹出数组
ret=PopArray(win,input_field[item_no].pop_array,input_field[item_no].pop_item,row,col,input_field[item_no].pop_item,tmp_pop_buff);
if( ret==2 ) //ESC
{
touchwin(win);
wrefresh(win);
return(27);
}
else if(ret==1) // ->
{
touchwin(win);
wrefresh(win);
//校验输入值
if( (input_field[item_no].chk_fun)!=((int)0) ){
wstandend(win); //关闭反显
if( (input_field[item_no].chk_fun)(input_field[item_no].val)!=0 ) {
wstandout(win); //打开反显
goto repeat2;
}
}
return(1);
}
else if(ret==-1) // <-
{
touchwin(win);
wrefresh(win);
//校验输入值
if( (input_field[item_no].chk_fun)!=((int)0) ){
wstandend(win); //关闭反显
if( (input_field[item_no].chk_fun)(input_field[item_no].val)!=0 ) {
wstandout(win); //打开反显
goto repeat2;
}
}
return(-1);
}
else //enter
{
memcpy(input_field[item_no].val,tmp_pop_buff,input_field[item_no].maxlen);
input_field[item_no].val[input_field[item_no].maxlen]='\0';
for( iii=input_field[item_no].col;iii<input_field[item_no].col+input_field[item_no].maxlen;iii++)
mvwprintw(win,input_field[item_no].row,iii,"%s"," ");
mvwprintw(win,input_field[item_no].row,input_field[item_no].col,"%s",(input_field[item_no].val));//显示字符串
touchwin(win);
wrefresh(win);
//校验输入值
if( (input_field[item_no].chk_fun)!=((int)0) ){
wstandend(win); //关闭反显
if( (input_field[item_no].chk_fun)(input_field[item_no].val)!=0 ) {
wstandout(win); //打开反显
goto repeat2;
}
}
return(1);
}
}
//无弹出数组/外挂输入函数,从键盘输入
while(1){
noecho(); //add by gwq 20040326
ch=wgetch(win);
echo(); //add by gwq 20040326
//如非控制键,则判断数据类型
if( !((ch=='\t') || (ch==27) || (ch==10) || (ch==8) || (ch==KEY_UP) || (ch==KEY_DOWN) || (ch==KEY_LEFT) || (ch==KEY_RIGHT) ||(ch==23)) )
{
switch(input_field[item_no].type)//判断输入的数据是否为所要求的类型
{
case 'a': //字母
if( (!isalpha(ch)) && (ch!=27) && (ch!=10) && (ch!=8) && (ch!=KEY_UP) && (ch!=KEY_DOWN) && (ch!=KEY_LEFT) && (ch!=KEY_RIGHT) &&(ch!=23) ){
beep();
continue;
}
break;
case '9': //数字(可正可负)
if( (!isdigit(ch)) && (ch!='.') && (ch!=27) && (ch!=10) && (ch!=8) && (ch!=KEY_UP) && (ch!=KEY_DOWN) && (ch!=KEY_LEFT) && (ch!=KEY_RIGHT) &&(ch!=23) ){
if(ch=='-') //第一个字符可为'-'
if(strlen((input_field[item_no].val))==0) break;
beep();
continue;
}
if(ch=='.') //不能有两个小数点
if(strchr((input_field[item_no].val),'.')!=NULL) {
beep();
continue;
}
break;
case '+': //正数(>=0)
if( (!isdigit(ch)) && (ch!='.') && (ch!=27) && (ch!=10) && (ch!=8) && (ch!=KEY_UP) && (ch!=KEY_DOWN) && (ch!=KEY_LEFT) && (ch!=KEY_RIGHT) &&(ch!=23) ){
beep();
continue;
}
if(ch=='.') //不能有两个小数点
if(strchr((input_field[item_no].val),'.')!=NULL) {
beep();
continue;
}
break;
case '-': //负数(<=0)
if( (!isdigit(ch)) && (ch!='-') && (ch!='.') && (ch!=27) && (ch!=10) && (ch!=8) && (ch!=KEY_UP) && (ch!=KEY_DOWN) && (ch!=KEY_LEFT) && (ch!=KEY_RIGHT) &&(ch!=23) ){
beep();
continue;
}
if(strlen((input_field[item_no].val))>0 && ch=='-' ) //第一个字符必为'-'
{
beep();
continue;
}
if(ch=='.') //不能有两个小数点
if(strchr((input_field[item_no].val),'.')!=NULL) {
beep();
continue;
}
break;
case 'z': //正整数
if( (!isdigit(ch)) && (ch!=27) && (ch!=10) && (ch!=8) && (ch!=KEY_UP) && (ch!=KEY_DOWN) && (ch!=KEY_LEFT) && (ch!=KEY_RIGHT) &&(ch!=23) ){
beep();
continue;
}
if(ch=='0') //第一个字符不能为'0'
if(strlen((input_field[item_no].val))==0){
beep();
continue;
}
break;
case 'd': //时间
if( (!isdigit(ch)) && (ch!=27) && (ch!=10) && (ch!=8) && (ch!=KEY_UP) && (ch!=KEY_DOWN) && (ch!=KEY_LEFT) && (ch!=KEY_RIGHT) &&(ch!=23) ){ // 正整数
beep();
continue;
}
// 1=<月分<=12 ;1=<日<=当月最大天数
if( check_day(input_field[item_no].val,ch)!=0 )
{
beep();
continue;
}
break;
case '*': //不限
break;
}
}
switch(ch) //据不同的控制键进行不同的处理
{
case KEY_DOWN:
case 10: //回车
sprintf(input_field[item_no].qs,"%s",input_field[item_no].val);
//校验输入信息
if( (input_field[item_no].chk_fun)!=((int)0) ){
wstandend(win); //关闭反显
if( (input_field[item_no].chk_fun)(input_field[item_no].val)!=0 ) {
wmove(win,input_field[item_no].row,input_field[item_no].col+cur);
wstandout(win); //打开反显
break;
}
}
return(1);
break;
case 8: //删除键
if( cur>0 ){
cur--;
i--;
mvwaddch(win,input_field[item_no].row,input_field[item_no].col+i,input_field[item_no].ch1);
//输入缓冲区光标处后内容左移一个字节
strcpy((input_field[item_no].val)+cur,(input_field[item_no].val)+cur+1);
if(input_field[item_no].type=='p') //输入密码显示'*'
mvwprintw(win,input_field[item_no].row,input_field[item_no].col,"%s",repeat_ch('*',strlen((input_field[item_no].val))) );
else
mvwprintw(win,input_field[item_no].row,input_field[item_no].col,"%s",(input_field[item_no].val));
wmove(win,input_field[item_no].row,input_field[item_no].col+cur);
}
else
{
//校验输入信息
if( (input_field[item_no].chk_fun)!=((int)0) ){
wstandend(win); //关闭反显
if( (input_field[item_no].chk_fun)(input_field[item_no].val)!=0 ) {
wmove(win,input_field[item_no].row,input_field[item_no].col+cur);
wstandout(win); //打开反显
break;
}
}
sprintf(input_field[item_no].qs,"%s",input_field[item_no].val);
return(-1);
}
break;
case KEY_UP:
//校验输入信息
if( (input_field[item_no].chk_fun)!=((int)0) ){
wstandend(win); //关闭反显
if( (input_field[item_no].chk_fun)(input_field[item_no].val)!=0 ) {
wmove(win,input_field[item_no].row,input_field[item_no].col+cur);
wstandout(win); //打开反显
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -