此头文件的更老版本可以参考: ICUF_HEAD_06.h.
开发环境:Visual Studio 2019
//TANXL_CONSOLE_LIST.H(ICUF_HEAD_07.H) #ifndef TANXL_CONSOLE_LIST #define TANXL_CONSOLE_LIST #include <iostream> #include <string> #include <fstream> #include <conio.h> #include <iomanip> using namespace std; ofstream fout; ifstream fin; const char* HeadFile = "HeadFile.txt"; inline void Col(int ColN)//设置自定义行的背景颜色 { if (ColN == 0)cout << "\033[0m";//清除颜色 else { cout << "\033[4;1;7m"; if (ColN == 1)cout << "\033[31m";//背景红色 else if (ColN == 2)cout << "\033[32m";//背景绿色 else if (ColN == 3)cout << "\033[33m";//背景黄色 else if (ColN == 4)cout << "\033[34m";//背景蓝色 else if (ColN == 5)cout << "\033[35m";//背景紫色 else if (ColN == 6)cout << "\033[36m";//背景淡蓝 else if (ColN == 7)cout << "\033[37m";//背景白色 else if (ColN == 8)Col((rand() % 6) + 1);//随机颜色(1-7) else if (ColN == 10)cout << "\033[40m";//字体黑色 else if (ColN == 11)cout << "\033[41m";//字体红色 else if (ColN == 12)cout << "\033[42m";//字体绿色 else if (ColN == 13)cout << "\033[43m";//字体黄色 else if (ColN == 14)cout << "\033[44m";//字体蓝色 else if (ColN == 15)cout << "\033[45m";//字体紫色 else if (ColN == 16)cout << "\033[46m";//字体淡蓝 else if (ColN == 17)cout << "\033[47m";//字体白色 else if (ColN == 18)Col((rand() % 6) + 11);//随机颜色(11-17) } } enum Status { eMainList, eSonList }; typedef class MainList { public: int Times{};//用于计算某一函数的执行次数,同时用于限定某些代码只执行一次 int TempTimes{}; int SonLists = 0;//表示类中含有的字符串数量 void SetCol(int ColS, int ColU, int ColD = 7, int SonC = 6);//列表的背景颜色设置功能 void SetFont(int ColS, int ColU, int ColD, int SonC);//列表的字体颜色设置功能 void RecoverTimes();//复原被转移的Times值 void ResetTimes();//将Times的值转移到TempTimes void InitList(int Start = 0);//列表初始化函数,默认初始化第一个选项为选定状态 void Append(string FunctionName, int Times = 1);//List数组添加String成员 void RemoveAll();//用于移除List数组中的所有String成员 void SetLimit(int Max);//设置每页的最大显示数量,超出范围则默认为9 void DisplayList(MainList List);//能够访问私有变量的子列表输出器 void SetListName(string Name);//设置列表的名称 void SetMain();//将列表设置为主列表,即包含子列表的列表 void ShowTitle();//展示标题,标题背景色采用DefaultCol void SetTitle(string Temp);//设置标题内容 int InsertAction();//输入控制(针对WASD、ZXC、↑↓←→以及数字1到9作出反应) int DisplayList(int LStart = 0, int LEnd = 9, int Switch = 0, int Return = 0);//显示列表,两个默认参数表示显示的开始行和结束行 int DisplayListS(int LStart = 0, int LEnd = 9, int Return = 0);//子列表输出函数 int CheckCurrent();//找到当前指向的选项 当找不到时返回-1 int GetLimit();//获取每页的最大显示数量 int GetPages();//获取总页面数 string GetListName(); private: void MoveUp();//选项上移 void MoveDown();//选项下移 int Page{ 1 }; int Pages{ 1 }; int LimitEachPage{ 9 }; int ListStatus[50]{ -1 };//存放选项状态 int SonCol{ 6 };//子列表背景颜色 int SelectedCol{ 7 };//选中的背景颜色 int UnSelectedCol{ 1 };//未选中的背景颜色 int DefaultCol{ 1 };//标题背景颜色 int SonFont{ 10 };//子列表字体颜色 int SelectedFont{ 10 };//选中的字体颜色 int UnSelectedFont{ 10 };//未选中的字体颜色 int DefaultFont{ 10 };//标题字体颜色 int DStat{}, DChos{}, SChos{}; Status Stat{ eSonList }; string ListName; string List[50]{};//存放选项名称 string Title{ "欢迎使用TANXL_CONSOLE_LIST WiChG_Trade" }; }MainList; inline void Free(MainList* Fun)//释放指针 { delete Fun; Fun = NULL; } void MainList::SetCol(int ColS, int ColU, int ColD, int SonC)//列表的背景颜色设置功能 { this->SelectedCol = ColS;//选中物品栏的颜色 this->UnSelectedCol = ColU;//未选中的其他物品颜色 this->DefaultCol = ColD;//默认主题颜色 this->SonCol = SonC;//默认子列表颜色 } void MainList::SetFont(int ColS, int ColU, int ColD, int SonC)//列表的字体颜色设置功能 { this->SelectedFont = ColS;//选中物品栏的颜色 this->UnSelectedFont = ColU;//未选中的其他物品颜色 this->DefaultFont = ColD;//默认主题颜色 this->SonFont = SonC;//默认子列表颜色 } void MainList::RecoverTimes()//复原被转移的Times值 { this->Times += ++this->TempTimes; this->TempTimes = 0; } void MainList::ResetTimes()//将Times的值转移到TempTimes { this->TempTimes += ++this->Times; this->Times = 0; } void MainList::InitList(int Start)//列表初始化函数,默认初始化第一个选项为选定状态 { for (int i = 0; i < SonLists; i++) { ListStatus[i] = 0; } for (int i = SonLists; i < 50; i++) { ListStatus[i] = -1; } ListStatus[Start] = 1; } void MainList::DisplayList(MainList TempList) { int Start = (TempList.Page - 1) * TempList.LimitEachPage; int End = Start + TempList.LimitEachPage; int UnSeCol = TempList.SonCol; int UnSeFont = TempList.SonFont; for (int i = Start; i < End + (9 - TempList.LimitEachPage); i++) { if (TempList.ListStatus[i] != -1) { if (TempList.ListStatus[i] == 1) { Col(TempList.SelectedCol); Col(TempList.SelectedFont); } else { Col(UnSeCol); Col(UnSeFont); } cout << setw(23) << TempList.List[i] << setw(16) << " " << endl; Col(0); } } cout << endl; } int MainList::DisplayList(int LStart, int LEnd, int Switch, int Return)//显示列表 ICUF_H_06中添加两个默认参数,可用于显示指定行 { int Start = (Page - 1) * LimitEachPage; int End = Start + LimitEachPage; int UnSeCol = UnSelectedCol; int UnSeFont = UnSelectedFont; int ReturnS{}; if (Switch == 1)//Switch值为1时 显示此页面的各种基本信息 cout << "FunId: " << CheckCurrent() << " Limit: " << LimitEachPage << " Page: " << Page << " Start: " << Start << " End: " << End << endl << endl; if (Switch == 2)//Switch值为2时 输出子页面的列表 且使用子页面的颜色 { UnSeCol = SonCol; UnSeFont = SonFont; } for (int i = Start + LStart; i < End + (LEnd - LimitEachPage); i++) { if (ListStatus[i] != -1) { if (ListStatus[i] == 1) { Col(SelectedCol); Col(SelectedFont); } else { Col(UnSeCol); Col(UnSeFont); } cout << setw(23) << List[i] << setw(16) << " " << endl; if (Switch != 2) cout << endl; Col(0); } } if (Switch == 2) cout << endl; if (Return != 0) ReturnS = InsertAction(); else return 0; return ReturnS; } int MainList::InsertAction()//输入控制 { char Key; int Temp; Key = _getch(); if (Key == 'c' || Key == 'C')//如果输入了大小写的C则返回上一级 return 3; if (SonLists == 0) return 0; if ((int)(Key - 48) > 0 && (int)(Key - 48) <= 9)//判断是否是从零到九的数字 { if ((int)(Key - 48) > SonLists)//如果是,且小于等于选项总数则直接指定这个选项 InitList(SonLists - 1); else InitList((int)(Key - 48) - 1);//如果超出了最大值,则指向最大值 return 4; } else if (Key == 'w' || Key == 'W' || Key == 72)//如果输入了大小写的W或者上箭头,则执行MoveUp函数 { MoveUp(); return 0; } else if (Key == 's' || Key == 'S' || Key == 80)//如果输入了大小写的S或者下箭头,则执行MoveDown函数 { MoveDown(); return 0; } else if (Key == 'a' || Key == 'A' || Key == 75)//如果输入了大小写的A或者左箭头,则执行向上翻页函数 { if (Page == GetPages() && GetPages() == 1) { Temp = CheckCurrent(); ListStatus[Temp] = 0; ListStatus[0] = 1; } else if (Page != 1) { Page--; Temp = CheckCurrent(); ListStatus[Temp] = 0; ListStatus[Temp - LimitEachPage] = 1; } else { Page = GetPages(); Temp = CheckCurrent(); ListStatus[Temp] = 0; ListStatus[(Page - 1) * LimitEachPage] = 1; } return 0; } else if (Key == 'd' || Key == 'D' || Key == 77)//如果输入了大小写的D或者右箭头,则执行向下翻页函数 { if (Page == GetPages() && GetPages() == 1) { Temp = CheckCurrent(); ListStatus[Temp] = 0; ListStatus[SonLists - 1] = 1; } else if (Page != GetPages()) { Page++; Temp = CheckCurrent(); ListStatus[Temp] = 0; if (Temp + LimitEachPage >= SonLists - 1) ListStatus[SonLists - 1] = 1; else ListStatus[Temp + LimitEachPage] = 1; } else { Page = 1; Temp = CheckCurrent(); ListStatus[Temp] = 0; ListStatus[Temp % LimitEachPage] = 1; } return 0; } else if (Key == 'z' || Key == 'Z')//保留原功能的情况下,预留两个用户自定义返回值 { return 1; } else if (Key == 'x' || Key == 'X') { return 2; } else if (Key == '\r')//回车确认 return 4; return 0; } int MainList::CheckCurrent()//找到当前指向的选项 当找不到时返回-1 { for (int j = 0; j < SonLists; j++) { if (ListStatus[j] == 1) return j; } return -1; } void MainList::Append(string FunctionName, int Times)//List数组添加String成员 { if (Times != 0) return; List[SonLists] = FunctionName; SonLists += 1;//成员计数器 } void MainList::RemoveAll()//用于移除List数组中的所有String成员 { for (int i = 0; i < 10; i++) { List[i] = {}; SonLists = 0; } } void MainList::SetLimit(int Max)//设置每页的最大显示数量,超出范围则默认为9 { LimitEachPage = (Max > 9 || Max <= 0) ? 9 : Max; } int MainList::GetPages()//获取总页面数 { if (SonLists % LimitEachPage != 0) Pages = SonLists / LimitEachPage + 1; else Pages = SonLists / LimitEachPage; return Pages; } int MainList::GetLimit()//获取每页的最大显示数量 { return LimitEachPage; } void MainList::MoveUp()//选项上移 { int i = CheckCurrent();//找到当前指向的选项 if (i == 0 && SonLists == 1)//如果只有一个选项则不变 ListStatus[i] = 1; else if (i == 0 && SonLists != 1)//如果指向第一个且不止包含一个选项,则改为指向最下方的选项 { ListStatus[i] = 0; Page = GetPages(); ListStatus[SonLists - 1] = 1; } else if ((i + 1) % LimitEachPage == 1)//如果指向某一页面的第一项则翻页,并指向前一页的最后一项 { if (Page != 1) { Page--; ListStatus[i] = 0; ListStatus[i - 1] = 1; } else { Page = GetPages(); ListStatus[i] = 0; ListStatus[SonLists - 1] = 1; } } else//正常情况 { ListStatus[i] = 0; ListStatus[i - 1] = 1; } } void MainList::MoveDown()//选项下移 { int i = CheckCurrent();//找到当前指向的选项 if (i == 0 && SonLists == 1)//如果只有一个选项则不变 ListStatus[i] = 1; else if (i != 0 && i == SonLists - 1)//如果指向最后一个且不止包含一个选项,则改为指向最上方的选项 { ListStatus[SonLists - 1] = 0; Page = 1; ListStatus[0] = 1; } else if ((i + 1) % LimitEachPage == 0)//如果指向某一页面的最后一项则翻页,并指向下一页的第一项 { if (Page != GetPages()) { Page++; ListStatus[i] = 0; ListStatus[i + 1] = 1; } else { Page = 1; ListStatus[i] = 0; ListStatus[0] = 1; } } else//正常情况 { ListStatus[i] = 0; ListStatus[i + 1] = 1; } } void MainList::SetListName(string Name) { this->ListName = Name; } string MainList::GetListName() { return this->ListName; } void MainList::SetMain() { Stat = eMainList; } void MainList::SetTitle(string Temp) { Title = Temp; } void MainList::ShowTitle() { Col(DefaultCol); Col(DefaultFont); cout << endl << endl << endl << endl; cout << setw(23) << " " << setw(33) << Title << setw(17) << " " << endl << endl; Col(0); } int MainList::DisplayListS(int LStart, int LEnd, int Return)//显示列表 ICUF_H_06中添加两个默认参数,可用于显示指定行 { int Start = (Page - 1) * LimitEachPage; int End = Start + LimitEachPage; int ReturnS{}; for (int i = Start + LStart; i < End + (LEnd - LimitEachPage); i++) { if (ListStatus[i] != -1) { if (ListStatus[i] == 1) { Col(SelectedCol); Col(SelectedFont); } else { Col(SonCol); Col(SonFont); } cout << setw(23) << List[i] << setw(16) << " " << endl; Col(0); } } cout << endl; if (Return != 0) ReturnS = InsertAction(); else return 0; return ReturnS; } #endif