📄 windowfun.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 + -