📄 q_edit.cpp
字号:
#include "qcurses/Q_Edit.hpp"/*######################################### 函数功能:析构函数 ## 返 回 值:NULL ## 函数参数:NULL #########################################*/Q_Edit::~Q_Edit(){ delete []Value;}//------------------------------------------------------------------------------------------/*######################################### 函数功能:构造函数 ## 返 回 值:NULL ## 函数参数:WINDOW *vMainWin 主窗口 ## int vWidth 宽度 ## int vYBegin 起始 ## int vXBegin 起始 ## int vCFront 文字颜色 ## int vCBack 背景色 ## int vMode 模式 #########################################*/Q_Edit::Q_Edit(WINDOW *vMainWin,int vWidth,int vYBegin,int vXBegin,int vCFront,int vCBack,int vMode):Q_Object(vMainWin, 1, vWidth, vYBegin, vXBegin, false, vCFront, vCBack){ //在主窗口的前后加入 [] mvwaddch(MainWin,_beginy,_beginx-1,'['); mvwaddch(MainWin,_beginy,_beginx+WorkWin->_maxx,']'); wrefresh(MainWin); //将当前窗口刷新 wattron(WorkWin,A_UNDERLINE); waddstr(WorkWin," "); wmove(WorkWin,0,0); wrefresh(WorkWin); //初始化数值 Decimal = 0; NowKey = 0; Value = new char[90]; Mode = vMode; memset(Value,'\0',90);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:设置文字 ## 返 回 值:NULL ## 函数参数:char *Text 要显示的文字 ## ... 用 vprintf #########################################*/void Q_Edit::Set(const char *format,...){ //赋值 va_list ap; va_start (ap,format); if(vsprintf(Value,format,ap)<0) strcpy(Value,"TooLong"); va_end(ap); //打印-暂时不提供 Money 类 wattroff(WorkWin,A_UNDERLINE); mvwaddstr(WorkWin,0,0," "); switch (Mode) { case MINTAGER: //整形 mvwaddstr(WorkWin,0,WorkWin->_maxx-strlen(Value),Value); break; case MDOUBLE: //浮点型 mvwaddstr(WorkWin,0,WorkWin->_maxx-strlen(Value),Value); break; case MSTRING: //字符串 mvwaddstr(WorkWin,0,0,Value); break; } wattron(WorkWin,A_UNDERLINE); wrefresh(WorkWin);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:判断是否小数部分够了 ## 返 回 值:是否够了 ## 函数参数:NULL #########################################*/bool Q_Edit::isFullDecimal(){ int i=0,j=0,k=0; char *Temp = new char[90]; memset(Temp,'\0',90); GetNowLine(Temp); for (i=0;i<WorkWin->_maxx-1;i++) if (Temp[i]=='.') break; for (j=i+1;j<WorkWin->_maxx-1;j++) { if (Temp[j]==' ') break; k++; } delete []Temp; if (k>=Decimal) return(true); return(false);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:取得当前行的值 ## 返 回 值:NULL ## 函数参数:char *TEMP 临时字符串 #########################################*/void Q_Edit::GetNowLine(char *TEMP){ int x,y,i; getyx(WorkWin,x,y); for(i=0;i<=WorkWin->_maxx-1;i++) TEMP[i] = mvwinch(WorkWin,0,i); TEMP[i] = '\0'; wmove(WorkWin,x,y);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:从 Edit 控件中查找字符 ## 返 回 值:实际个数 ## 函数参数:char CH 查找字符 #########################################*/int Q_Edit::FindCH(char CH){ int numb=0; char *Temp = new char[90]; memset(Temp,'\0',90); GetNowLine(Temp); for(int i=0;i<WorkWin->_maxx-1;i++) { if (Temp[i] == CH) numb++; } delete []Temp; return(numb);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:得到数值 ## 返 回 值:NULL ## 函数参数:NULL #########################################*/void Q_Edit::GetValue(){ GetNowLine(Value); Value[FindLastSpace(Value)] = '\0'; //赋值完毕后显示出来 Set(Value);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:找到字符串的最后一个空白 ## 返 回 值:空白的下标 ## 函数参数:char *VAL 查找字符串 #########################################*/int Q_Edit::FindLastSpace(char *VAL){ int LEN = strlen(VAL); for (int i=LEN-1;i>=0;i--) { if(VAL[i] != 32) return(i+1); } return(0);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:找到字符串的最后一个空白 ## 返 回 值:空白的下标 ## 函数参数:char *VAL 查找字符串 #########################################*/bool Q_Edit::isEnd(){ char Tch,x,y; getyx(WorkWin,x,y); Tch = mvwinch(WorkWin,0,WorkWin->_maxx-1); if(Tch!=' ') { wmove(WorkWin,x,y); return(true); } wmove(WorkWin,x,y); return(false);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:在控件上获取数值 ## 返 回 值:键盘的最后输入 ## 函数参数:NULL #########################################*/int Q_Edit::Get(){ curs_set(1); //打开光标 int x=strlen(Value); int FirstKey=0; //第一次输入,如果是0就略过 wattron(WorkWin,A_UNDERLINE); mvwaddstr(WorkWin,0,0," "); wattroff(WorkWin,A_UNDERLINE); mvwaddstr(WorkWin,0,0,Value); wattron(WorkWin,A_UNDERLINE); wrefresh(WorkWin); while (1) { GetKey(); wrefresh(WorkWin); if (isCheckBreak(NowKey)) //退出键 break; if (isFilterKey(NowKey)) //过滤键 continue; if (FirstKey==0) { mvwaddstr(WorkWin,0,0," "); wrefresh(WorkWin); x=0; FirstKey++; } //一切OK后开始录入数值 if(NowKey==8) { int z,y; if (x>=WorkWin->_maxx-1) { x=WorkWin->_maxx-1; mvwdelch(WorkWin,0,x-1); } mvwdelch(WorkWin,0,x-1); if(x>0) x--; else x=0; getyx(WorkWin,z,y); mvwaddch(WorkWin,z,WorkWin->_maxx-1,' '); wmove(WorkWin,z,y); } else if(NowKey==KEY_LEFT) { if(x>0) x--; else x=0; } else if(NowKey==KEY_RIGHT) { if(x<WorkWin->_maxx-1) x++; else x=WorkWin->_maxx-1; wmove(WorkWin,0,x); } else { if (isEnd()) continue; wattroff(WorkWin,A_UNDERLINE); mvwinsch(WorkWin,0,x,NowKey); wattron(WorkWin,A_UNDERLINE); if(x<WorkWin->_maxx-1) x++; } wmove(WorkWin,0,x); } GetValue(); curs_set(0); //关闭光标 return(NowKey);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:检查过滤 ## 返 回 值:是否通过 ## 函数参数:int &Key 检查的字符 #########################################*/bool Q_Edit::isFilterKey(int &Key){ switch (Mode) { case MINTAGER: //整形 if ((Key<48 || Key>57) && Key!= 8) return(true); break; case MSTRING: //字符串 break; case MDOUBLE: //浮点型 if ((Key<48 || Key>57) && Key!= 8 && Key!=46) return(true); if (FindCH('.')>=1 && Key==46) return(true); if (Key!= 8) if (Decimal!=0 && isFullDecimal()) return(true); break; } if (Key==KEY_UP || Key==KEY_DOWN || Key==127) return(true); return(false);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:检查是否键入了退出按钮 ## 返 回 值:是否通过 ## 函数参数:int &Key 检查的字符 #########################################*/bool Q_Edit::isCheckBreak(int &Key){ if (Key==10) return(true); if (Key==9) return(true); if (Key==KEY_UP) return(true); if (Key==KEY_DOWN) return(true); return(false);}//------------------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -