⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 input.c

📁 通用的UNIX全屏幕录入程序
💻 C
📖 第 1 页 / 共 2 页
字号:
					}
				}
				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 + -