📄 q_list.cpp
字号:
#include "qcurses/Q_List.hpp"/*# 最后修改时间 2004-12-6 ,加入了一个 TmpValue 用来装载超过 RealMaxx 的变量#####*//*######################################### 函数功能:构造函数 ## 函数参数:WINDOW *vMainWin 主窗口 ## int vHeight 高度 ## int vWidth 宽度 ## int vYBegin 起始y ## int vXBegin 起始x ## bool vBox 是否画框 ## int vCFront 文字颜色 ## int vCBack 背景颜色 ## int vMaxCount 最大值 #########################################*/Q_List::Q_List(WINDOW *vMainWin,int vHeight,int vWidth,int vYBegin,int vXBegin,bool vBox,int vCFront,int vCBack,int vMaxCount):Q_Object(vMainWin, vHeight, vWidth, vYBegin, vXBegin, vBox, vCFront, vCBack){ EndRow = 0; NowKey = 0; nCount = 0; NowLINE = 0; NowIndex = 0; NowTopINDEX = 0; if (vMaxCount>MAXCOUNT || vMaxCount==0) vMaxCount = MAXCOUNT; MaxCount = vMaxCount;}//------------------------------------------------------------------------------------------/*######################################### 函数功能:析构函数 ## 返 回 值:NULL ## 函数参数:NULL #########################################*/Q_List::~Q_List(){ FreeValue();}//------------------------------------------------------------------------------------------/*######################################### 函数功能:控件获取值 ## 返 回 值:返回的是最后的键盘值 ## 函数参数:NULL #########################################*/int Q_List::Get(){ int line=RealY+NowLINE; //行 int index=NowIndex; //索引 char *TmpValue = new char[1024]; wattroff(WorkWin,A_REVERSE); Refresh(NowTopINDEX); wattron(WorkWin,A_REVERSE); memset(TmpValue,'\0',1024); strcpy(TmpValue,Value[NowIndex]); TmpValue[RealMaxx-2]='\0'; mvwaddstr(WorkWin,RealY+NowLINE,RealX,TmpValue); wattroff(WorkWin,A_REVERSE); for (; ; ) { GetKey(); wrefresh(WorkWin); if(isCheckBreak(NowKey)) //退出键 break; wattroff(WorkWin,A_REVERSE); memset(TmpValue,'\0',1024); strcpy(TmpValue,Value[index]); TmpValue[RealMaxx-2]='\0'; mvwaddstr(WorkWin,line,RealX,TmpValue); if(NowKey==KEY_UP) { if (index<=0) index=0; else { index--; line--; } } if(NowKey==KEY_DOWN) { if (index >= nCount-1) index = nCount-1; else { index++; line++; } } if(NowKey==338) //PageDown { if (index+(RealMaxy*2)<nCount) index+=RealMaxy; else { if (nCount-RealMaxy>0) index=nCount-RealMaxy; else index=0; } line=0; } if(NowKey==339) //PageUp { if (index-RealMaxy>=0) index-=RealMaxy; else index = 0; line=0; } if(NowKey==KEY_HOME) //Home { index=0; line=0; } if(NowKey==KEY_END) //End { index = nCount-1; if (nCount-1>RealMaxy) line = RealY+RealMaxy; else line = RealY+nCount-1; } if (line>RealY+RealMaxy-1) { line = RealY+RealMaxy-1; Refresh(index-RealMaxy+1); NowTopINDEX = index-RealMaxy+1; } if (line<RealY) { line = RealY; Refresh(index); NowTopINDEX = index; } wattron(WorkWin,A_REVERSE); memset(TmpValue,'\0',1024); strcpy(TmpValue,Value[index]); TmpValue[RealMaxx-2]='\0'; mvwaddstr(WorkWin,line,RealX,TmpValue); wattroff(WorkWin,A_REVERSE); }// wattroff(WorkWin,A_REVERSE);// mvwaddstr(WorkWin,line,RealX,Value[index]); wrefresh(WorkWin); NowIndex = index; NowLINE = line-1; return(NowKey);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:检查是否键入了退出按钮 ## 返 回 值:是否属于 ## 函数参数:当前按键 #########################################*/bool Q_List::isCheckBreak(int& Key){ if (Key==10) return(true); if (Key==9) return(true); if (Key==KEY_LEFT) return(true); if (Key==KEY_RIGHT) return(true); return(false);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:从 start 开始刷新 ## 返 回 值:NULL ## 函数参数:开始值 #########################################*/void Q_List::Refresh(int StartLine){ int LINES = RealY,i=0; char *TmpValue = new char[1024]; for (i=StartLine;i<StartLine+RealMaxy;i++) { if (i>=nCount) break; memset(TmpValue,'\0',1024); strcpy(TmpValue,Value[i]); TmpValue[RealMaxx-2]='\0'; mvwaddstr(WorkWin,LINES,RealX,TmpValue); for (int j=RealX+strlen(TmpValue);j<RealX+RealMaxx;j++) mvwprintw(WorkWin,LINES,j," "); LINES++; } if (StartLine>0) mvwaddstr(WorkWin,RealY,RealX+RealMaxx-2,"↑"); else mvwaddstr(WorkWin,RealY,RealX+RealMaxx-2," "); if (i<nCount) mvwaddstr(WorkWin,RealY+RealMaxy-1,RealX+RealMaxx-2,"↓"); else mvwaddstr(WorkWin,RealY+RealMaxy-1,RealX+RealMaxx-2," "); wrefresh(WorkWin);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:从 start 开始刷新 ## 返 回 值:NULL ## 函数参数:开始值 #########################################*/bool Q_List::Add(char *format,...){ //赋值 char *TempStr = new char[1024]; va_list ap; va_start (ap,format); if(vsprintf(TempStr,format,ap)<0) strcpy(TempStr,"TooLong"); va_end(ap); Value[nCount] = new char[strlen(TempStr)+1]; memset(Value[nCount],'\0',strlen(TempStr)+1); strcpy(Value[nCount],TempStr); delete []TempStr; if (nCount>=MaxCount && MaxCount>0) return false; else nCount++; if (EndRow <= RealMaxy) EndRow++; Refresh(0); NowLINE = 0; NowIndex = 0; NowTopINDEX = 0; wrefresh(WorkWin); return(true);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:清空数据从头开始 ## 返 回 值:NULL ## 函数参数:NULL #########################################*/void Q_List::Clear(){ int i=0; char *SPACE = new char[RealMaxx]; FreeValue(); memset(SPACE,' ',RealMaxx); SPACE[RealMaxx-1]='\0'; for (i=RealY;i<=RealMaxy;i++) mvwprintw(WorkWin,i,RealX,"%s",SPACE); wmove(WorkWin,RealX,RealY); delete []SPACE; nCount = 0; NowLINE = 0; NowIndex = 0; NowTopINDEX = 0; wrefresh(WorkWin);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:将当前列表写入指定文件 ## 返 回 值:成功写入返回 true 否则 false ## 函数参数:char *FileName 写入文件 #########################################*/bool Q_List::WriteToFile(char *FileName){ FILE *FP; if ((FP=fopen(FileName,"w"))==NULL) return(false); for (int i=0;i<nCount;i++) fprintf(FP,"%s\n",Value[i]); fclose(FP); return(true);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:是否所有列表值 ## 返 回 值:NULL ## 函数参数:NULL #########################################*/void Q_List::FreeValue(){ for (int i=0;i<nCount;i++) delete []Value[i];}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -