📄 input.c
字号:
}
}
sprintf(input_field[item_no].qs,"%s",input_field[item_no].val);
return(-1);
break;
case KEY_LEFT: //<--
if(cur>0){
cur--;
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_RIGHT: //->
if(cur<i){
cur++;
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 23: //ctrl+w结束输入返回
//校验输入信息
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(0);
break;
case 27: //ESC
return(27);
break;
default: //一般字符
if( (i==input_field[item_no].maxlen) &&(i==cur)){
//校验输入信息
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);
}
else
{
(input_field[item_no].val)[cur]=ch;
if(cur==i) i++;
cur++;
//从起始处显示已输入的字符串
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);
}
} //end of switch
} //end of while
} //end of function Input
//判断日期的合法性
int check_day(char *str,char ch)
{
int len;
char month[3],year[5],day[3];
int day_of_month[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if( (ch==27) || (ch==10) || (ch==8) || (ch==KEY_UP) || (ch==KEY_DOWN) || (ch==KEY_LEFT) || (ch==KEY_RIGHT) ||(ch==23) )
return(0);
len=strlen(str);
switch(len)
{
case 0:
case 1:
case 2:
case 3:
return(0);
break;
case 4:
if( ch-48>1 )
return(1);
else
return(0);
break;
case 5:
month[0]=str[4];month[1]=ch;month[2]='\0';
if( atoi(month)<13 && atoi(month)>0 )
return(0);
else
return(1);
break;
case 6:
sprintf(month,"%2.2s",str+4);
if( atoi(month)==2 ){ //二月
if( ch-48>2 )
return(1);
else
return(0);
}
else
{
if( ch-48>3 )
return(1);
else
return(0);
}
break;
case 7:
sprintf(year,"%4.4s",str);
sprintf(month,"%2.2s",str+4);
day[0]=str[6];day[1]=ch;day[2]='\0';
if( atoi(year)%400==0 || (atoi(year)%4==0 && atoi(year)%100!=0) ) //润年
if( atoi(month)==2 )
day_of_month[2]=29;
//日期不超过当月最大天数
if( atoi(day)<=day_of_month[atoi(month)] && atoi(day)>0 )
return(0);
else
return(1);
break;
default:
return(0);
}
}
/********************************************************************
原 形: int INPUT( WINDOW * win,INPUT_FIELD input_field[],int total_item);
功 能: 域内的字符串输入.输入域反显,可在域间编辑字符串
参数说明:
typedef struct{
int row; //输入域的起始行座标
int col; //输入域的起始列座标
char *tsxx; //显示于屏幕底部的提示信息
char val[80]; //存放输入数据的变量
int maxlen; //输入域的长度
char ch1; //填充输入域的字符
char qs[80]; //缺省输入字符串
char type; //输入数据类型: 'a'--字母,'9'--数字(可正可负可小数),
// '-'--负数,'+'--正数,'z'--正整数,
// 'p'--密码,'d'--日期,'*'--不限,
int pop_item; //弹出框的条数 <=0代表无
char pop_array[21][80];
//弹出框指针,{""}代表无,回车返回数据项的前maxlen个字符
//到val中
int (* chk_fun)();
//校验输入值val的自定义函数指针, ((int)0)表示空函数
//函数原形: int chk_fun(char *str)
//返回 0:正常,对下一个域进行输入 !0:校验失败,重新输入
int (* input_from_dev_fun)();
//外挂输入自定义函数(如:刷卡器/密码键盘),((int)0)表空函数
//函数原形: int input_from_dev_fun(char val[80])
//返回 0:正常,对下一个域进行输入 !0:失败,重新输入
} INPUT_FIELD;-----输入域的描述
total_item -----域的个数
返 回: 0--ctrl+w确认返回, 1--ESC取消返回
作 者: 谷维强
时 间: 2001.10.15 于南宁
*********************************************************************/
int INPUT( WINDOW * win,INPUT_FIELD input_field[],int total_item)
{
int i,mov_flag,yes_no;
char * repeat_ch( char,int);
int YesNo();
if( total_item==0 )
return(0);
keypad(win,1);
noecho(); //关闭屏幕回显
wstandout(win); //打开反显
//初始化存放数据的缓冲区,屏幕输入区
for(i=0;i<total_item;i++){
memset(input_field[i].val,0,80);
sprintf(input_field[i].val,"%-s",input_field[i].qs);
//显示添充域
mvwprintw(win,input_field[i].row,input_field[i].col,"%s",repeat_ch(input_field[i].ch1,input_field[i].maxlen));
if( input_field[i].pop_item>0 && input_field[i].pop_array[0]!=NULL ){
wstandend(win);
mvwprintw(win,input_field[i].row,input_field[i].col+input_field[i].maxlen,"%s","↓");
wstandout(win);
}
//显示缺省字符串
if(input_field[i].type=='p')
mvwprintw(win,input_field[i].row,input_field[i].col,"%s",repeat_ch('*',strlen((input_field[i].val))) );
else
mvwprintw(win,input_field[i].row,input_field[i].col,"%s",input_field[i].val);
}
touchwin(win);
wrefresh(win);
//据 Input() 的返回值,对不同的 input_field[i] 进行操作
//按ctrl+w保存退出,ESC取消返回
i=0;
while(1){
mov_flag=Input(win,input_field,i);
//wrefresh(win);
//-----add 2003.06.02
//输完最后一个域后,弹出确认窗口
if( i == total_item-1 ) //最后一个输入域
if( mov_flag!=27 ) //不是ESC
if( YesNo(win)=='1' )
mov_flag = 0; //确认
//-------
if( mov_flag==1 )
{
i=i+1;
if( i==total_item )
i=0;
}
else if( mov_flag==-1 )
{
i=i-1;
if( i==-1 )
i=total_item-1;
}
else if( mov_flag==0 || mov_flag==27 )
break;
}
wstandend(win); //关闭反显
keypad(win,0);
echo(); //打开屏幕回显
//xxts("");
if( mov_flag==0 ) //ctrl+w
{
return(0);
}
else //ESC
{
return(1);
}
}
//确认窗口
//'1'--确认 '0'--重新输入
int YesNo(WINDOW * input_win)
{
WINDOW *yn_win;
int ch;
yn_win=newwin(5, 33, 16, 25);
wstandend(yn_win);
keypad(yn_win,1);
box(yn_win, 0, 0 );
mvwprintw(yn_win, 1, 13, "确定提交?");
wstandout(yn_win);
mvwprintw(yn_win, 3, 10, "是1" ); mvwprintw(yn_win, 3, 21, "否0" );
wstandend(yn_win);
noecho(); //关闭屏幕回显
RP:
ch=wgetch(yn_win);
if( (ch!='1') && (ch!='0') ){
goto RP;
}
echo();
delwin(yn_win);
touchwin(input_win);
wrefresh(input_win);
return(ch);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -