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

📄 input.c

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