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

📄 windowfun.c

📁 在linux平台下模拟超市的收银系统即POS机
💻 C
字号:
//////////////////////////////////////////////////////////////////////////
//							画window的一些函数存放处
//////////////////////////////////////////////////////////////////////////
#include "PosSystem.h"
#include <stdlib.h>
#include <time.h>
WINDOW* CreateWindow(int hight,int width,int startY,int startX,enum IsBorder isBorder,enum Colore_Index index)
{
	WINDOW* win=newwin(hight,width,startY,startX);
	if(isBorder==Yes)
	{
		box(win,0,0);
	}
	//默认情况下不带颜色
	if(index!=Default)
	{
		wbkgd(win,COLOR_PAIR(index));
	}
	wrefresh(win);
	return win;
}

/*
//画水平线  旧的画水平线
void printhline(WINDOW * win,int hight,int startY,int startX)
{
	mvwaddch(win,hight,0,ACS_LTEE);
	mvwhline(win,hight,1,ACS_HLINE,78);
	mvwaddch(win,hight,79,ACS_RTEE);
	wrefresh(win);
}
*/
//画水平线
void printhline(WINDOW * win,int hight,int startY,int startX)
{
	/*
	mvwaddch(win,hight,0,ACS_LTEE);
	mvwhline(win,hight,1,ACS_HLINE,78);
	mvwaddch(win,hight,79,ACS_RTEE);
	*/
	mvwaddch(win,hight,startY-1,ACS_LTEE);
	mvwhline(win,hight,startY,ACS_HLINE,startX);
	mvwaddch(win,hight,startX+1,ACS_RTEE);
	wrefresh(win);
}

// 获取字符串水平居中位置
int GetStringLevelPrintSit(WINDOW * win,char * str)
{
	int strLength=strlen(str);
	int maxY,maxX;
	getmaxyx(win,maxY,maxX);
	return (maxX-strLength)/2;
}

//销毁指定窗口
void DestroyWindow(WINDOW * win)
{
	wclear(win);
	wrefresh(win);
	delwin(win);
}




int GetChar(WINDOW * win ,int startY,int startX)
{
	int temp='\0';
	if(win==NULL)
	{
		return temp;
	}
	keypad(win,TRUE);
	wmove(win,startY,startX);
	wrefresh(win);
	temp=wgetch(win);
	keypad(win,FALSE);
	return temp;
}

//取得字符串,返回特殊键码
int GetString(WINDOW * win,int startY,int startX,char *str,int strMaxLen)
{
	int curY,curX;
	//int maxY,maxX
	int temp,i;
	if(win==NULL)
	{
		return 0;
	}
	
	//取得指定窗口的光标位置

	getyx(win,curY,curX);

	if(curX>startX)
	{
		i = curX;		
	}
	else
	{
		i=startX;
	}
	//i 代表的是当前光标位置
	//getmaxyx(win,maxY,maxX);
	for(;i<startX+strMaxLen+1;)  //startX+strMaxLen+1
	{

		temp=GetChar(win,startY,i);

		//当temp为退格,并且不是第一个位置的时候
		if(temp==KEY_BACKSPACE && i>startX)
		{
			i--;
			mvwprintw(win,startY,i," ");
			wmove(win,startY,i);

			str[i-startX]='\0';
			continue;
		}
		else if(temp==KEY_BACKSPACE)
		{
			continue;
		}
		//当输入的是字母或数字,或空格
		if( isgraph(temp) || (temp==' ') )
		{	
			if(i-startX>=strMaxLen)
			{
				str[i-startX] = '\0';
			}
			else
			{
				str[i-startX] = temp;
				if(i<startX+strMaxLen)
				{
					i++;
					str[i-startX] = '\0';
					mvwaddch(win,startY,i-1,temp);
					wrefresh(win);
				}
			}
		}
		else
		{
			return temp;
		}
	}
}

int SignValidate(char *number1,char sign)//输入一个字符串,还有单个字符,判断这个字符在字符串中总共有几个
{
	int i,j,len = strlen(number1);
	for (i = 0, j = 0;i < len;i++)
	{
		if (number1[i] == sign)
		{
			j++;
		}
		
	}
	return j;
	
}


//取得数字字符串,返回特殊键码
int GetNumber(WINDOW * win,int startY,int startX,char *str,int strMaxLen)
{
	int curY,curX;
	//int maxY,maxX
	int temp,i;
	if(win==NULL)
	{
		return 0;
	}
	
	//取得指定窗口的光标位置

	getyx(win,curY,curX);

	if(curX>startX)
	{
		i = curX;		
	}
	else
	{
		i=startX;
	}
	//i 代表的是当前光标位置
	//getmaxyx(win,maxY,maxX);
	for(;i<startX+strMaxLen+1;)  //startX+strMaxLen+1
	{

		temp=GetChar(win,startY,i);

		//当temp为退格,并且不是第一个位置的时候
		if(temp==KEY_BACKSPACE && i>startX)
		{
			i--;
			mvwprintw(win,startY,i," ");
			wmove(win,startY,i);

			str[i-startX]='\0';
			continue;
		}
		else if(temp==KEY_BACKSPACE)
		{
			continue;
		}
		//当输入的是字母或数字,或空格
		if( isdigit(temp) )
		{	
			if(i-startX>=strMaxLen)
			{
				str[i-startX] = '\0';
			}
			else
			{
				str[i-startX] = temp;
				if(i<startX+strMaxLen)
				{
					i++;
					str[i-startX] = '\0';
					mvwaddch(win,startY,i-1,temp);
					wrefresh(win);
				}
			}
		}
		else
		{
			return temp;
		}
	}
}



//取得单精度的字符串,返回特殊键码
int GetFloat(WINDOW * win,int startY,int startX,char *str,int strMaxLen)
{
	int curY,curX;
	//int maxY,maxX
	int temp,i;
	if(win==NULL)
	{
		return 0;
	}
	
	//取得指定窗口的光标位置

	getyx(win,curY,curX);

	if(curX>startX)
	{
		i = curX;		
	}
	else
	{
		i=startX;
	}
	//i 代表的是当前光标位置
	//getmaxyx(win,maxY,maxX);
	for(;i<startX+strMaxLen+1;)  //startX+strMaxLen+1
	{

		temp=GetChar(win,startY,i);

		//当temp为退格,并且不是第一个位置的时候
		if(temp==KEY_BACKSPACE && i>startX)
		{
			i--;
			mvwprintw(win,startY,i," ");
			wmove(win,startY,i);

			str[i-startX]='\0';
			continue;
		}
		else if(temp==KEY_BACKSPACE)
		{
			continue;
		}
		//当输入的是字母或数字,或空格
		if( isdigit(temp) || temp == '.' || temp == '-')
		{	
			if ((SignValidate(str,'.') > 0) && (temp == '.'))
			{
				continue;
			}
			if ((SignValidate(str,'-') > 0) && (temp == '-'))
			{
				continue;
			}
			if(i-startX>=strMaxLen)
			{
				str[i-startX] = '\0';
			}
			else
			{
				str[i-startX] = temp;
				if(i<startX+strMaxLen)
				{
					i++;
					str[i-startX] = '\0';
					mvwaddch(win,startY,i-1,temp);
					wrefresh(win);
				}
			}

		}
		else
		{
			return temp;
		}
	}
}





int GetPasswordString(WINDOW * win,int startY,int startX,char *str,int strMaxLen)
{
	int curY,curX;
	//int maxY,maxX
	int temp,i;
	if(win==NULL)
	{
		return 0;
	}
	
	//取得指定窗口的光标位置
	
	getyx(win,curY,curX);
	
	if(curX>startX)
	{
		i = curX;		
	}
	else
	{
		i=startX;
	}
	//i 代表的是当前光标位置
	//getmaxyx(win,maxY,maxX);
	for(;i<startX+strMaxLen+1;)
	{
		temp=GetChar(win,startY,i);
		
		//当temp为退格,并且不是第一个位置的时候
		if(temp==KEY_BACKSPACE && i>startX)
		{
			i--;
			mvwprintw(win,startY,i," ");
			wmove(win,startY,i);
			
			str[i-startX]='\0';
			continue;
		}
		else if(temp==KEY_BACKSPACE)
		{
			continue;
		}
		//当输入的是字母或数字,或空格
		if( isgraph(temp) || (temp==' ') )
		{			
			str[i-startX] = temp;
			if(i<startX+strMaxLen)
			{
				i++;
				str[i-startX] = '\0';
				mvwaddch(win,startY,i-1,'*');//密码时以*号回显
				wrefresh(win);
			}
		}
		else
		{
			return temp;
		}
	}
}





void StringCenterPrint(WINDOW * win,int startY,char * str)
{
	int sit;
	if(win!=NULL)
	{
		sit=GetStringLevelPrintSit(win,str);//取得标题字符串的水平居中位置
		mvwprintw(win,startY,sit,str);
		wrefresh(win);
	}
}

//创建按钮窗口
WINDOW * CreateButtonWindow(int startY,int startX,enum IsBorder isBorder,enum Colore_Index coloreIndex,char * str)
{
	WINDOW * button=CreateWindow(1,8,startY,startX,isBorder,coloreIndex);
	StringCenterPrint(button,0,str);
	//printhline(button,2,1,7);//画水平线
	wrefresh(button);
	return button;
}

//进入钮窗口
void IntoButtonWindow(WINDOW * win,enum Colore_Index coloreIndex)
{
	curs_set(0);//0隐藏 1显示
	keypad(win,TRUE);
	wbkgd(win,COLOR_PAIR(coloreIndex));
	wrefresh(win);
}

//退出按钮窗口
void LeaveButtonWindow(WINDOW * win,enum Colore_Index coloreIndex)
{

	wbkgd(win,COLOR_PAIR(coloreIndex));
	wrefresh(win);
	curs_set(1);//0隐藏 1显示
	keypad(win,FALSE);
}

//消息框窗口
int Message_Box(int hight,int width,int startY,int startX,enum Colore_Index coloreIndex,char *title,char * message)
{
	scr_dump("save.scr");
	WINDOW *win=CreateWindow(hight,width,startY,startX,Yes,coloreIndex);	
	StringCenterPrint(win,1,title);

	printhline(win,2,1,width-2);//画水平线

	StringCenterPrint(win,4,message);
	StringCenterPrint(win,6,"请按任意键返回");
	wrefresh(win);
	int ch=GetChar(win,0,0);
	DestroyWindow(win);
	scr_restore("save.scr");
	//refresh();
	return 0;
}

int error_login(char *msg,char *fname,int len)
{
    time_t curTime;
    struct tm *tblock;
    char buf[200];
    FILE *fp;
    char *pathname;
    int slen;
    char str_tm[22];
    pathname=(fname!=NULL)?fname:"../log/errorlog.log";
    slen=(len)?len:strlen(msg);
    curTime=time(NULL);
    tblock=localtime(&curTime);
    strftime(str_tm,sizeof("[2002-01-01 00:00:00]"),"[%Y-%m-%d %H:%M:%S]",tblock);

    if ((fp=fopen(pathname,"a"))!=NULL)
    {
        //fwrite(buf,sizeof(char),strlen(buf),fp);
        fwrite(str_tm,sizeof(char),strlen(str_tm),fp);
		fwrite(" ",sizeof(char),strlen(" "),fp);
        fwrite(msg,sizeof(char),slen,fp);
        fwrite("\n",sizeof(char),strlen("\n"),fp);
        fclose(fp);
        return 0;
    }
    return -1;
}

//将商品转换成出售记录
void ConverToSaleRec(product * pro,saleProduct * sale,int amount)
{
	strcpy(sale->bar_code,pro->bar_code);
	strcpy(sale->product_name,pro->product_name);
	strcpy(sale->unit,pro->unit);
	strcpy(sale->spec,pro->spec);
	sale->sale_price=pro->sale_price;
	sale->amount=amount;//数量
	sale->money=sale->sale_price*amount;
}


/*
int Check_Money(char * strMoney)
{
	int strLength=strlen(strMoney);
	int i=0;
	for(i=0;i<strLength;i++)
	{
		if(isdigit()||strMoney[i]=='.')
	}
}
*/

//判断是否为空
int isNull(char* str)
{
	if(strlen(str) == 0)
		return 1;
	else
		return 0;
}

//验证money(前提是屏蔽输入非法字符,只允许输入0-9和。)
int isFloat(char* str)
{
	int num = strlen(str);
	int i=0,dot=0;
	for(; i<num; ++i)
	{
		if(str[i]=='.')
		{
			dot++;
		}
	}
	if(dot>1)
	{
		return 1;  //非法金额
	}
	return 0;
}


//判断一个浮点型输入是否符合大于min,小于max,格式是否正确,正确返回1,格式错或为空返回0,太小返回-1,太大返回-2
int Float_Input_Validate(char *floatnum,float min,float max)
{
	int i,sign,len;
	float temp_float;
	Trim(floatnum);//去掉左右空格
	if (!Input_Short(floatnum,1))// 判断输入是否为空
	{
		return 0;
	}
	i = SignValidate(floatnum,'.');
	if (i > 1)
	{
		return 0;
	}
		
	if (floatnum[0] == '-')//判断第一个是否负号,是的话sign置1,表示数字部分从sign开始,方便循环
	{
		
		sign = 1;
	}else sign = 0;
	i=SignValidate(floatnum,'-');
	if (i>sign)
	{
		return 0;
	}
	len = strlen(floatnum);
	for (i = sign;i < len;i++)
	{
		if (!(isdigit(floatnum[i]) || floatnum[i] == '.'))// 从符号位开始只允许数字和.
		{
			return 0;
		}
	}
	temp_float = atof(floatnum);
	if (temp_float < min)
	{
		return -1;
	}
	if (temp_float > max)
	{
		return -2;
	}
	
	return 1;	
} 




//判断一个数字型输入是否符合大于min,小于max,正确返回1,格式错或为空返回0,太小返回-1,太大返回-2
int Int_Input_Validate(char *floatnum,int min,int max)
{
	int i,sign,len;
	int temp_float;
	Trim(floatnum);
	if (!Input_Short(floatnum,1))// 判断输入是否为空
	{
		return 0;
	}

	len = strlen(floatnum);
	for (i = 0;i < len;i++)
	{
		if (!(isdigit(floatnum[i])))// 从符号位开始只允许数字和.
		{
			return 0;
		}
	}
	temp_float = atoi(floatnum);
	if (temp_float < min)
	{
		return -1;
	}
	if (temp_float > max)
	{
		return -2;
	}
	
	return 1;
}


int Char_Input_Validate(char *str,int min,int max)//只允许字母和空格,符合返回1,不符返回0,太短返回-1,太长返回-2
{
	Trim(str);
	int i,len = strlen(str);
	if (len < min)
	{
		return -1;
	}
	if (len > max)
	{
		return -2;
	}
	for (i = 0;i < len;i++)
	{
		if (isalpha(str[i]) || str[i] == ' ')
		{
			continue;
		}
		return 0;
	}


	return 1;
}


//判断字符串min内是否为结束符,为结束符返回假
int Input_Short(char *str,int min)
{
	int i;
	for	(i = 0;i < min;i++)
	{
		if((str[i] == '\0'))
		{
			
			return 0;
		}
	
	}
	return 1;
}
int Input_Long(char *str,int max)//判断是否字符串是否超出最大允许输入的个数
{
	if (strlen(str)>max)
	{
		return 0;
	}
	return 1;
}

//判断是否是闰年
int IsLeapYear(int year)
{
	if(year%4==0 && year%100!=0 || year%400==0)
	{
		return 1;//真返回1
	}
	return 0; //假返回0
}

//验证数值是否在给定范围
int CheckRange(int value,int start,int end)
{
	if(value>=start && value<=end)
	{
		return 1;
	}
	return 0;
}

//返回 1代表年错误 2代表月错误 ,3代表日错误
int checkDate(int year,int month, int day)
{
	int months[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	//验证年份的
	if(year<1)
	{
		return 1;//年份错误,年不能小于1
	}
	//验证月份的
	if(month<1 || month>12)
	{
		return 2;//月份不能小于1大于12
	}

	//验证日的
	if(IsLeapYear(year) && month==2)
	{
		if(!CheckRange(day,1,months[month-1]+1))
		{
			return 3;//日期是错的
		}
	}
	else
	{
		if(!CheckRange(day,1,months[month-1]))
		{
			return 3;//日期是错的
		}
	}
}








⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -