C++控制台代码实现一定的界面效果Ⅴ(完成版)

此头文件的更老版本可以参考: ICUF_HEAD_06.h.

此头文件的简洁版本可以参考: TANXL_CONSOLE_LIST.h(Version 1.4+).

开发环境:Visual Studio 2019


TANXL_CONSOLE_LIST.H(ICUF_HEAD_07.H)

1、取消了头文件中的using语句。
2、颜色设置的范围全覆盖。
3、增加头文件等包含的判断。
4、所有公有变量改为私有,并提供函数来获取。
5、增加大量列表的细节功能。
6、输入控制功能整合到展示列表中。
7、增加字体颜色设置功能。
8、增加枚举类作为列表的级别。
//TANXL_CONSOLE_LIST.H(ICUF_HEAD_07.H)

#ifndef TANXL_CONSOLE_LIST
#define TANXL_CONSOLE_LIST
#ifndef TANXL_LIST//检查是否使用了其他版本的TANXL_CONSOLE_LIST
#define TANXL_LIST 1
#define LIST 1
#else
#define LIST 0
#endif
#endif
#if LIST
#ifndef IOSTREAM//检查是否已经包含IOSTREAM
#define IOSTREAM
#include <iostream>
#endif
#ifndef STRING//检查是否已经包含STRING
#define STRING
#include <string>
#endif
#ifndef CONIO_H//检查是否已经包含CONIO_H
#define CONIO_H
#include <conio.h>
#endif
#ifndef IOMANIP//检查是否已经包含IOMANIP
#define IOMANIP
#include <iomanip>
#endif
namespace CONSOLE_LIST
{
	const char* HeadFile = "HeadFile.txt";
	inline void Col(int ColN)//设置自定义行的背景颜色
	{
		if (ColN == 0)std::cout << "\033[0m";//清除颜色
		else
		{
			std::cout << "\033[4;1;7m";
			if (ColN == 1)std::cout << "\033[31m";//背景红色
			else if (ColN == 2)std::cout << "\033[32m";//背景绿色
			else if (ColN == 3)std::cout << "\033[33m";//背景黄色
			else if (ColN == 4)std::cout << "\033[34m";//背景蓝色
			else if (ColN == 5)std::cout << "\033[35m";//背景紫色
			else if (ColN == 6)std::cout << "\033[36m";//背景淡蓝
			else if (ColN == 7)std::cout << "\033[37m";//背景白色
			else if (ColN == 8)Col((rand() % 6) + 1);//随机颜色(1-7)
			else if (ColN == 10)std::cout << "\033[40m";//字体黑色
			else if (ColN == 11)std::cout << "\033[41m";//字体红色
			else if (ColN == 12)std::cout << "\033[42m";//字体绿色
			else if (ColN == 13)std::cout << "\033[43m";//字体黄色
			else if (ColN == 14)std::cout << "\033[44m";//字体蓝色
			else if (ColN == 15)std::cout << "\033[45m";//字体紫色
			else if (ColN == 16)std::cout << "\033[46m";//字体淡蓝
			else if (ColN == 17)std::cout << "\033[47m";//字体白色
			else if (ColN == 18)Col((rand() % 6) + 11);//随机颜色(11-17)
		}
	}
	typedef enum class Status
	{
		eMainList,
		eSonList
	}Status;
	typedef class MainList
	{
	public:
		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(std::string FunctionName, int Times = 1);//List数组添加String成员
		void RemoveAll();//用于移除List数组中的所有String成员
		void SetLimit(int Max);//设置每页的最大显示数量,超出范围则默认为9
		void DisplayList(MainList List);//能够访问私有变量的子列表输出器
		void SetListName(std::string Name);//设置列表的名称
		void ShowTitle();//展示标题,标题背景色采用DefaultCol
		void SetTitle(std::string Temp);//设置标题内容
		void SetStatus(Status Sta);//设置页面级别
		void SetSpace(int Left = 23, int Right = 17, int Title = 33);//设置空格数
		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();//获取总页面数
		int GetSonLists();//获取子页面选项数量
		int GetTimes();//获取页面执行次数的值
		int GetTimeS();//获取页面执行次数的值并在获取后加一
		int GetTempTimes();//获取页面执行次数的临时值
		Status GetStatus();//获取页面级别
		std::string GetListName();//获取列表的名称
	private:
		void MoveUp();//选项上移
		void MoveDown();//选项下移
		int Times{};//用于计算某一函数的执行次数,同时用于限定某些代码只执行一次
		int TempTimes{};//临时存放Times的值
		int Page{ 1 };//当前指向的页面
		int Pages{ 1 };//总页面数量
		int LimitEachPage{ 9 };//页面选项上限
		int SonLists{ 0 };//表示类中含有的字符串数量
		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 WidthL{ 23 }, WidthR{ 17 }, WidthT{ 33 };//选项和标题的空格数
		Status Stat{ Status::eSonList };//页面级别
		std::string ListName;//列表的名称
		std::string List[50]{};//存放选项名称
		std::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);
				}
				std::cout << std::setw(WidthL) << TempList.List[i] << std::setw(WidthR) << " " << std::endl;
				Col(0);
			}
		}
		std::cout << std::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时 显示此页面的各种基本信息
			std::cout << "FunId: " << CheckCurrent() << "  Limit: " << LimitEachPage << "  Page: " << Page << "  Start: " << Start << "  End: " << End << std::endl << std::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);
				}
				std::cout << std::setw(WidthL) << List[i] << std::setw(WidthR) << " " << std::endl;
				if (Switch != 2)
					std::cout << std::endl;
				Col(0);
			}
		}
		if (Switch == 2)
			std::cout << std::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(std::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(std::string Name)
	{
		this->ListName = Name;
	}
	std::string MainList::GetListName()
	{
		return this->ListName;
	}
	void MainList::SetTitle(std::string Temp)
	{
		Title = Temp;
	}
	void MainList::ShowTitle()
	{
		Col(DefaultCol); Col(DefaultFont);
		std::cout << std::endl << std::endl << std::endl << std::endl;
		std::cout << std::setw(WidthL) << " " << std::setw(WidthT) << Title << std::setw(WidthR) << " " << std::endl << std::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);
				}
				std::cout << std::setw(WidthL) << List[i] << std::setw(WidthR) << " " << std::endl;
				Col(0);
			}
		}
		std::cout << std::endl;
		if (Return != 0)
			ReturnS = InsertAction();
		else
			return 0;
		return ReturnS;
	}
	int MainList::GetSonLists()
	{
		return SonLists;
	}
	int MainList::GetTimes()
	{
		return Times;
	}
	int MainList::GetTimeS()
	{
		return Times++;
	}
	int MainList::GetTempTimes()
	{
		return TempTimes;
	}
	void MainList::SetStatus(Status Sta)
	{
		Stat = Sta;
	}
	Status MainList::GetStatus()
	{
		return Stat;
	}
	void MainList::SetSpace(int Left, int Right, int Title)
	{
		WidthL = Left;
		WidthR = Right;
		WidthT = Title;
	}
}
#endif

Version 1.1 2021/10/10

1.构造函数中增加对List数组的初始化,原固定大小数组移除。
2.添加动态扩展List数组大小的功能。
3.将变量名SonLists修改为ListSize避免歧义。
//TANXL_CONSOLE_LIST.H(ICUF_HEAD_07.H)
//Version 1.1  2021/10/10  18:30

#ifndef TANXL_CONSOLE_LIST
#define TANXL_CONSOLE_LIST
#ifndef TANXL_LIST//检查是否使用了其他版本的TANXL_CONSOLE_LIST
#define TANXL_LIST 1
#define LIST 1
#else
#define LIST 0
#endif
#endif
#if LIST
#ifndef IOSTREAM//检查是否已经包含IOSTREAM
#define IOSTREAM
#include <iostream>
#endif
#ifndef STRING//检查是否已经包含STRING
#define STRING
#include <string>
#endif
#ifndef CONIO_H//检查是否已经包含CONIO_H
#define CONIO_H
#include <conio.h>
#endif
#ifndef IOMANIP//检查是否已经包含IOMANIP
#define IOMANIP
#include <iomanip>
#endif
namespace CONSOLE_LIST
{
	const char* HeadFile = "HeadFile.txt";
	inline void Col(int ColN)//设置自定义行的背景颜色
	{
		if (ColN == 0)std::cout << "\033[0m";//清除颜色
		else
		{
			std::cout << "\033[4;1;7m";
			if (ColN == 1)std::cout << "\033[31m";//背景红色
			else if (ColN == 2)std::cout << "\033[32m";//背景绿色
			else if (ColN == 3)std::cout << "\033[33m";//背景黄色
			else if (ColN == 4)std::cout << "\033[34m";//背景蓝色
			else if (ColN == 5)std::cout << "\033[35m";//背景紫色
			else if (ColN == 6)std::cout << "\033[36m";//背景淡蓝
			else if (ColN == 7)std::cout << "\033[37m";//背景白色
			else if (ColN == 8)Col((rand() % 6) + 1);//随机颜色(1-7)
			else if (ColN == 10)std::cout << "\033[40m";//字体黑色
			else if (ColN == 11)std::cout << "\033[41m";//字体红色
			else if (ColN == 12)std::cout << "\033[42m";//字体绿色
			else if (ColN == 13)std::cout << "\033[43m";//字体黄色
			else if (ColN == 14)std::cout << "\033[44m";//字体蓝色
			else if (ColN == 15)std::cout << "\033[45m";//字体紫色
			else if (ColN == 16)std::cout << "\033[46m";//字体淡蓝
			else if (ColN == 17)std::cout << "\033[47m";//字体白色
			else if (ColN == 18)Col((rand() % 6) + 11);//随机颜色(11-17)
		}
	}
	typedef enum class Status
	{
		eMainList,
		eSonList
	}Status;
	typedef class MainList
	{
	public:
		MainList(int InitSize = 20);//初始化线性表
		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(std::string FunctionName, int Times = 1);//List数组添加String成员
		void RemoveAll();//用于移除List数组中的所有String成员
		void SetLimit(int Max);//设置每页的最大显示数量,超出范围则默认为9
		void DisplayList(MainList List);//能够访问私有变量的子列表输出器
		void SetListName(std::string Name);//设置列表的名称
		void ShowTitle();//展示标题,标题背景色采用DefaultCol
		void SetTitle(std::string Temp);//设置标题内容
		void SetStatus(Status Sta);//设置页面级别
		void SetSpace(int Left = 23, int Right = 17, int Title = 33);//设置空格数
		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();//获取总页面数
		int GetListSize();//获取子页面选项数量
		int GetTimes();//获取页面执行次数的值
		int GetTimeS();//获取页面执行次数的值并在获取后加一
		int GetTempTimes();//获取页面执行次数的临时值
		Status GetStatus();//获取页面级别
		std::string GetListName();//获取列表的名称
	private:
		void MoveUp();//选项上移
		void MoveDown();//选项下移
		void Resize();//扩展线性表容量
		int Times{};//用于计算某一函数的执行次数,同时用于限定某些代码只执行一次
		int TempTimes{};//临时存放Times的值
		int Page{ 1 };//当前指向的页面
		int Pages{ 1 };//总页面数量
		int LimitEachPage{ 9 };//页面选项上限
		int ListSize{ 0 };//表示线性表中当前存在的元素个数
		int ListMaxSize{ 0 };//表示线性表中存在的最大元素个数
		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 WidthL{ 23 }, WidthR{ 17 }, WidthT{ 33 };//选项和标题的空格数
		Status Stat{ Status::eSonList };//页面级别
		std::string ListName;//列表的名称
		std::string* List;//存放选项名称
		std::string Title{ "欢迎使用TANXL_CONSOLE_LIST Version 1.1  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 < ListSize; i++)
		{
			ListStatus[i] = 0;
		}
		for (int i = ListSize; 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);
				}
				std::cout << std::setw(WidthL) << TempList.List[i] << std::setw(WidthR) << " " << std::endl;
				Col(0);
			}
		}
		std::cout << std::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时 显示此页面的各种基本信息
			std::cout << "FunId: " << CheckCurrent() << "  Limit: " << LimitEachPage << "  Page: " << Page << "  Start: " << Start << "  End: " << End << std::endl << std::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);
				}
				std::cout << std::setw(WidthL) << List[i] << std::setw(WidthR) << " " << std::endl;
				if (Switch != 2)
					std::cout << std::endl;
				Col(0);
			}
		}
		if (Switch == 2)
			std::cout << std::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 (ListSize == 0)
			return 0;
		if ((int)(Key - 48) > 0 && (int)(Key - 48) <= 9)//判断是否是从零到九的数字
		{
			if ((int)(Key - 48) > ListSize)//如果是,且小于等于选项总数则直接指定这个选项
				InitList(ListSize - 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[ListSize - 1] = 1;
			}
			else if (Page != GetPages())
			{
				Page++;
				Temp = CheckCurrent();
				ListStatus[Temp] = 0;
				if (Temp + LimitEachPage >= ListSize - 1)
					ListStatus[ListSize - 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 < ListSize; j++)
		{
			if (ListStatus[j] == 1)
				return j;
		}
		return -1;
	}
	void MainList::Append(std::string FunctionName, int Times)//List数组添加String成员
	{
		if (Times != 0)
			return;
		List[ListSize] = FunctionName;
		ListSize += 1;//成员计数器
	}
	void MainList::RemoveAll()//用于移除List数组中的所有String成员
	{
		for (int i = 0; i < 10; i++)
		{
			List[i] = {};
			ListSize = 0;
		}
	}
	void MainList::SetLimit(int Max)//设置每页的最大显示数量,超出范围则默认为9
	{
		LimitEachPage = (Max > 9 || Max <= 0) ? 9 : Max;
	}
	int MainList::GetPages()//获取总页面数
	{
		if (ListSize % LimitEachPage != 0)
			Pages = ListSize / LimitEachPage + 1;
		else
			Pages = ListSize / LimitEachPage;
		return Pages;
	}
	int MainList::GetLimit()//获取每页的最大显示数量
	{
		return LimitEachPage;
	}
	void MainList::MoveUp()//选项上移
	{
		int i = CheckCurrent();//找到当前指向的选项
		if (i == 0 && ListSize == 1)//如果只有一个选项则不变
			ListStatus[i] = 1;
		else if (i == 0 && ListSize != 1)//如果指向第一个且不止包含一个选项,则改为指向最下方的选项
		{
			ListStatus[i] = 0;
			Page = GetPages();
			ListStatus[ListSize - 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[ListSize - 1] = 1;
			}
		}
		else//正常情况
		{
			ListStatus[i] = 0;
			ListStatus[i - 1] = 1;
		}
	}
	void MainList::MoveDown()//选项下移
	{
		int i = CheckCurrent();//找到当前指向的选项
		if (i == 0 && ListSize == 1)//如果只有一个选项则不变
			ListStatus[i] = 1;
		else if (i != 0 && i == ListSize - 1)//如果指向最后一个且不止包含一个选项,则改为指向最上方的选项
		{
			ListStatus[ListSize - 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(std::string Name)
	{
		this->ListName = Name;
	}
	std::string MainList::GetListName()
	{
		return this->ListName;
	}
	void MainList::SetTitle(std::string Temp)
	{
		Title = Temp;
	}
	void MainList::ShowTitle()
	{
		Col(DefaultCol); Col(DefaultFont);
		std::cout << std::endl << std::endl << std::endl << std::endl;
		std::cout << std::setw(WidthL) << " " << std::setw(WidthT) << Title << std::setw(WidthR) << " " << std::endl << std::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);
				}
				std::cout << std::setw(WidthL) << List[i] << std::setw(WidthR) << " " << std::endl;
				Col(0);
			}
		}
		std::cout << std::endl;
		if (Return != 0)
			ReturnS = InsertAction();
		else
			return 0;
		return ReturnS;
	}
	int MainList::GetListSize()
	{
		return ListSize;
	}
	int MainList::GetTimes()
	{
		return Times;
	}
	int MainList::GetTimeS()
	{
		return Times++;
	}
	int MainList::GetTempTimes()
	{
		return TempTimes;
	}
	void MainList::SetStatus(Status Sta)
	{
		Stat = Sta;
	}
	Status MainList::GetStatus()
	{
		return Stat;
	}
	void MainList::SetSpace(int Left, int Right, int Title)
	{
		WidthL = Left;
		WidthR = Right;
		WidthT = Title;
	}
	void MainList::Resize()//扩展线性表容量
	{
		std::string* OldNames = List;
		ListMaxSize *= 2;
		List = new std::string[ListMaxSize];
		for (int i = 0; i < ListSize; i++)
			List[i] = OldNames[i];
	}
	MainList::MainList(int InitSize)//初始化线性表
	{
		ListMaxSize = InitSize;
		List = new std::string[ListMaxSize];
	}
}
#endif

Version 1.2 2021/10/12

1.DisplayList相关函数传入值优化
2.设置每页输出物品最大数量的功能修复
3.增加析构函数清理动态生成的数组
4.移除void DisplayList(MainList List)
5.移除页面级别等相关功能
//TANXL_CONSOLE_LIST.H(ICUF_HEAD_07.H)
//Version 1.2  2021/10/12  16:35


#ifndef TANXL_CONSOLE_LIST
#define TANXL_CONSOLE_LIST
#ifndef TANXL_LIST//检查是否使用了其他版本的TANXL_CONSOLE_LIST
#define TANXL_LIST
#define LIST 1
#endif
#endif
#if LIST
#ifndef IOSTREAM//检查是否已经包含IOSTREAM
#define IOSTREAM
#include <iostream>
#endif
#ifndef STRING//检查是否已经包含STRING
#define STRING
#include <string>
#endif
#ifndef CONIO_H//检查是否已经包含CONIO_H
#define CONIO_H
#include <conio.h>
#endif
#ifndef IOMANIP//检查是否已经包含IOMANIP
#define IOMANIP
#include <iomanip>
#endif
namespace CONSOLE_LIST
{
	const char* HeadFile = "HeadFile.txt";
	inline void Col(int ColN)//设置自定义行的背景颜色
	{
		if (ColN == 0)std::cout << "\033[0m";//清除颜色
		else
		{
			std::cout << "\033[4;1;7m";
			if (ColN == 1)std::cout << "\033[31m";//背景红色
			else if (ColN == 2)std::cout << "\033[32m";//背景绿色
			else if (ColN == 3)std::cout << "\033[33m";//背景黄色
			else if (ColN == 4)std::cout << "\033[34m";//背景蓝色
			else if (ColN == 5)std::cout << "\033[35m";//背景紫色
			else if (ColN == 6)std::cout << "\033[36m";//背景淡蓝
			else if (ColN == 7)std::cout << "\033[37m";//背景白色
			else if (ColN == 8)Col((rand() % 6) + 1);//随机颜色(1-7)
			else if (ColN == 10)std::cout << "\033[40m";//字体黑色
			else if (ColN == 11)std::cout << "\033[41m";//字体红色
			else if (ColN == 12)std::cout << "\033[42m";//字体绿色
			else if (ColN == 13)std::cout << "\033[43m";//字体黄色
			else if (ColN == 14)std::cout << "\033[44m";//字体蓝色
			else if (ColN == 15)std::cout << "\033[45m";//字体紫色
			else if (ColN == 16)std::cout << "\033[46m";//字体淡蓝
			else if (ColN == 17)std::cout << "\033[47m";//字体白色
			else if (ColN == 18)Col((rand() % 6) + 11);//随机颜色(11-17)
		}
	}
	typedef class MainList
	{
	public:
		MainList(int InitSize = 20);//初始化线性表
		~MainList();//析构函数
		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(std::string FunctionName, int Times = 1);//List数组添加String成员
		void RemoveAll();//用于移除List数组中的所有String成员
		void SetLimit(int NewLimit);//设置每页的最大显示数量,超出范围则设为默认值
		void SetListName(std::string Name);//设置列表的名称
		void ShowTitle();//展示标题,标题背景色采用DefaultCol
		void SetTitle(std::string Temp);//设置标题内容
		void SetSpace(int Left = 23, int Right = 17, int Title = 33);//设置空格数
		int InsertAction();//输入控制(针对WASD、ZXC、↑↓←→以及数字1到9作出反应)
		int DisplayList(int Switch, int Return = 0, int LStart = 0, int LEnd = 9);//显示列表,两个默认参数表示显示的开始行和结束行
		int DisplayListS(int Switch, int Return = 0, int LStart = 0, int LEnd = 9);//子列表输出函数
		int CheckCurrent();//找到当前指向的选项  当找不到时返回-1
		int GetLimit();//获取每页的最大显示数量
		int GetPages();//获取总页面数
		int GetListSize();//获取子页面选项数量
		int GetTimes();//获取页面执行次数的值
		int GetTimeS();//获取页面执行次数的值并在获取后加一
		int GetTempTimes();//获取页面执行次数的临时值
		std::string GetListName();//获取列表的名称
	private:
		void MoveUp();//选项上移
		void MoveDown();//选项下移
		void Resize();//扩展线性表容量
		int Times{};//用于计算某一函数的执行次数,同时用于限定某些代码只执行一次
		int TempTimes{};//临时存放Times的值
		int Page{ 1 };//当前指向的页面
		int Pages{ 1 };//总页面数量
		int LimitEachPage{ 9 };//页面选项上限
		int ListSize{ 0 };//表示线性表中当前存在的元素个数
		int ListMaxSize{ 0 };//表示线性表中存在的最大元素个数
		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 WidthL{ 23 }, WidthR{ 17 }, WidthT{ 33 };//选项和标题的空格数
		std::string ListName;//列表的名称
		std::string* List;//存放选项名称
		std::string Title{ "欢迎使用TANXL_CONSOLE_LIST Version 1.2  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 < ListSize; i++)
		{
			ListStatus[i] = 0;
		}
		for (int i = ListSize; i < 50; i++)
		{
			ListStatus[i] = -1;
		}
		ListStatus[Start] = 1;
	}
	int MainList::DisplayList(int Switch, int Return, int LStart, int LEnd)//显示列表 ICUF_H_06中添加两个默认参数,可用于显示指定行
	{
		if (Switch == 3)
		{
			LStart = 0;
			LEnd = LimitEachPage;
		}
		int Start = (Page - 1) * LimitEachPage;
		int End = Start + LimitEachPage;
		int UnSeCol = UnSelectedCol;
		int UnSeFont = UnSelectedFont;
		if (Switch == 1)//Switch值为1时 显示此页面的各种基本信息
			std::cout << "FunId: " << CheckCurrent() << "  Limit: " << LimitEachPage << "  Page: " << Page << "  Start: " << Start << "  End: " << End << std::endl << std::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);
				}
				std::cout << std::setw(WidthL) << List[i] << std::setw(WidthR) << " " << std::endl;
				if (Switch != 2)
					std::cout << std::endl;
				Col(0);
			}
		}
		if (Switch == 2)
			std::cout << std::endl;
		if (Return != 0)
			return InsertAction();
		else
			return 0;
	}
	int MainList::InsertAction()//输入控制
	{
		char Key;
		int Temp;
		Key = _getch();
		if (Key == 'c' || Key == 'C')//如果输入了大小写的C则返回上一级
			return 3;
		if (ListSize == 0)
			return 0;
		if ((int)(Key - 48) > 0 && (int)(Key - 48) <= 9)//判断是否是从零到九的数字
		{
			if ((int)(Key - 48) > ListSize)//如果是,且小于等于选项总数则直接指定这个选项
				InitList(ListSize - 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[ListSize - 1] = 1;
			}
			else if (Page != GetPages())
			{
				Page++;
				Temp = CheckCurrent();
				ListStatus[Temp] = 0;
				if (Temp + LimitEachPage >= ListSize - 1)
					ListStatus[ListSize - 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 < ListSize; j++)
		{
			if (ListStatus[j] == 1)
				return j;
		}
		return -1;
	}
	void MainList::Append(std::string FunctionName, int Times)//List数组添加String成员
	{
		if (Times != 0)
			return;
		List[ListSize] = FunctionName;
		ListSize += 1;//成员计数器
	}
	void MainList::RemoveAll()//用于移除List数组中的所有String成员
	{
		for (int i = 0; i < 10; i++)
		{
			List[i] = {};
			ListSize = 0;
		}
	}
	void MainList::SetLimit(int NewLimit)//设置每页的最大显示数量,超出范围则默认为9
	{
		LimitEachPage = NewLimit <= 0 ? 9 : NewLimit;
	}
	int MainList::GetPages()//获取总页面数
	{
		if (ListSize % LimitEachPage != 0)
			Pages = ListSize / LimitEachPage + 1;
		else
			Pages = ListSize / LimitEachPage;
		return Pages;
	}
	int MainList::GetLimit()//获取每页的最大显示数量
	{
		return LimitEachPage;
	}
	void MainList::MoveUp()//选项上移
	{
		int i = CheckCurrent();//找到当前指向的选项
		if (i == 0 && ListSize == 1)//如果只有一个选项则不变
			ListStatus[i] = 1;
		else if (i == 0 && ListSize != 1)//如果指向第一个且不止包含一个选项,则改为指向最下方的选项
		{
			ListStatus[i] = 0;
			Page = GetPages();
			ListStatus[ListSize - 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[ListSize - 1] = 1;
			}
		}
		else//正常情况
		{
			ListStatus[i] = 0;
			ListStatus[i - 1] = 1;
		}
	}
	void MainList::MoveDown()//选项下移
	{
		int i = CheckCurrent();//找到当前指向的选项
		if (i == 0 && ListSize == 1)//如果只有一个选项则不变
			ListStatus[i] = 1;
		else if (i != 0 && i == ListSize - 1)//如果指向最后一个且不止包含一个选项,则改为指向最上方的选项
		{
			ListStatus[ListSize - 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(std::string Name)
	{
		this->ListName = Name;
	}
	std::string MainList::GetListName()
	{
		return this->ListName;
	}
	void MainList::SetTitle(std::string Temp)
	{
		Title = Temp;
	}
	void MainList::ShowTitle()
	{
		Col(DefaultCol); Col(DefaultFont);
		std::cout << std::endl << std::endl << std::endl << std::endl;
		std::cout << std::setw(WidthL) << " " << std::setw(WidthT) << Title << std::setw(WidthR) << " " << std::endl << std::endl; Col(0);
	}
	int MainList::DisplayListS(int Switch, int Return, int LStart, int LEnd)//显示列表 ICUF_H_06中添加两个默认参数,可用于显示指定行
	{
		if (Switch == 1)
		{
			LStart = 0;
			LEnd = LimitEachPage;
		}
		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);
				}
				std::cout << std::setw(WidthL) << List[i] << std::setw(WidthR) << " " << std::endl;
				Col(0);
			}
		}
		std::cout << std::endl;
		if (Return != 0)
			ReturnS = InsertAction();
		else
			return 0;
		return ReturnS;
	}
	int MainList::GetListSize()
	{
		return ListSize;
	}
	int MainList::GetTimes()
	{
		return Times;
	}
	int MainList::GetTimeS()
	{
		return Times++;
	}
	int MainList::GetTempTimes()
	{
		return TempTimes;
	}
	void MainList::SetSpace(int Left, int Right, int Title)
	{
		WidthL = Left;
		WidthR = Right;
		WidthT = Title;
	}
	void MainList::Resize()//扩展线性表容量
	{
		std::string* OldNames = List;
		ListMaxSize *= 2;
		List = new std::string[ListMaxSize];
		for (int i = 0; i < ListSize; i++)
			List[i] = OldNames[i];
	}
	MainList::MainList(int InitSize)//初始化线性表
	{
		ListMaxSize = InitSize;
		List = new std::string[ListMaxSize];
	}
	MainList::~MainList()//析构函数
	{
		delete[] List;
		ListSize = 0;
		List = NULL;
	}
}
#endif

Version 1.3 2021/11/09

1.增加两个用于STRING转换的内联函数
2.颜色设置功能重写以提升效率
3.多个int标志量整合为十六进制数
//TANXL_CONSOLE_LIST.H(ICUF_HEAD_07.H)
//Version 1.3  2021/11/9  16:48


#ifndef TANXL_CONSOLE_LIST
#define TANXL_CONSOLE_LIST
#ifndef TANXL_LIST//检查是否使用了其他版本的TANXL_CONSOLE_LIST
#define TANXL_LIST
#define LIST 1
#endif
#endif
#if LIST
#ifndef IOSTREAM//检查是否已经包含IOSTREAM
#define IOSTREAM
#include <iostream>
#endif
#ifndef STRING//检查是否已经包含STRING
#define STRING
#include <string>
#endif
#ifndef CONIO_H//检查是否已经包含CONIO_H
#define CONIO_H
#include <conio.h>
#endif
#ifndef IOMANIP//检查是否已经包含IOMANIP
#define IOMANIP
#include <iomanip>
#endif
#ifndef SSTREAM//检查是否已经包含SSTREAM
#define SSTREAM
#include<sstream>
#endif
namespace CONSOLE_LIST
{
	const char* HeadFile = "HeadFile.txt";
	inline double StringToDouble(std::string& str)
	{
		std::istringstream iss(str);
		double DoubleN;
		if (iss >> DoubleN)return DoubleN;
		return 0.0;
	}
	inline int StringToInt(std::string& str)
	{
		std::istringstream iss(str);
		int IntN;
		if (iss >> IntN)return IntN;
		return 0;
	}
	void Col(unsigned ColN = NULL)//设置自定义行的背景颜色
	{
		if (ColN == NULL)std::cout << "\033[0m";//清除颜色
		else
		{
			std::cout << "\033[4;1;7m";
			if (((ColN & 0xf0) >> 4) > 0 && ((ColN & 0xf0) >> 4) <= 7)
				std::cout << "\033[3" << (ColN >> 4) << "m";
			else if ((ColN & 0xf0) >> 4 == 0);//值为0不作修改
			else//字体颜色: 1红色 2绿色 3橙色 4蓝色 5紫色 6淡蓝 7白色
				std::cout << "\033[3" << rand() % 7 + 1 << "m";
			if ((ColN & 0x0f) > 0 && ((ColN & 0x0f) <= 7))
				std::cout << "\033[4" << (ColN >> 4) << "m";
			else if ((ColN & 0x0f) == 0);//值为0不作修改
			else//背景颜色: 1红色 2绿色 3橙色 4蓝色 5紫色 6淡蓝 7白色
				std::cout << "\033[4" << rand() % 7 + 1 << "m";
		}
	}
	typedef class MainList
	{
	public:
		MainList(int InitSize = 20);//初始化线性表
		~MainList();//析构函数
		void SetCol(unsigned Scol, unsigned Ucol, unsigned Dcol, unsigned Ecol);//列表的背景颜色设置功能
		void RecoverTimes();//复原被转移的Times值
		void ResetTimes();//将Times的值转移到TempTimes
		void InitList(int Start = 0);//列表初始化函数,默认初始化第一个选项为选定状态
		void Append(std::string FunctionName, int Times = 1);//List数组添加String成员
		void RemoveAll();//用于移除List数组中的所有String成员
		void SetLimit(int NewLimit);//设置每页的最大显示数量,超出范围则设为默认值
		void SetListName(std::string Name);//设置列表的名称
		void ShowTitle();//展示标题,标题背景色采用DefaultCol
		void SetTitle(std::string Temp);//设置标题内容
		void SetSpace(unsigned Spaces = 0x171121);//设置空格数
		int InsertAction();//输入控制(针对WASD、ZXC、↑↓←→以及数字1到9作出反应)
		int DisplayList(int Switch, int Return = 0, int LStart = 0, int LEnd = 9);//显示列表,两个默认参数表示显示的开始行和结束行
		int DisplayListS(int Switch, int Return = 0, int LStart = 0, int LEnd = 9);//子列表输出函数
		int CheckCurrent();//找到当前指向的选项  当找不到时返回-1
		int GetLimit();//获取每页的最大显示数量
		int GetPages();//获取总页面数
		int GetListSize();//获取子页面选项数量
		int GetTimes();//获取页面执行次数的值
		int GetTimeS();//获取页面执行次数的值并在获取后加一
		int GetTempTimes();//获取页面执行次数的临时值
		std::string GetListName();//获取列表的名称
	private:
		void MoveUp();//选项上移
		void MoveDown();//选项下移
		void Resize();//扩展线性表容量
		int Times{};//用于计算某一函数的执行次数,同时用于限定某些代码只执行一次
		int TempTimes{};//临时存放Times的值
		int Page{ 1 };//当前指向的页面
		int Pages{ 1 };//总页面数量
		int LimitEachPage{ 9 };//页面选项上限
		int ListSize{ 0 };//表示线性表中当前存在的元素个数
		int ListMaxSize{ 0 };//表示线性表中存在的最大元素个数
		int ListStatus[50]{ -1 };//存放选项状态
		unsigned SSpace{ 0x171121 };//选项和标题的空格数
		unsigned SelectedCol{ 0x70 };//选中的字体与背景颜色
		unsigned UnSelectedCol{ 0x10 }; //未选中的字体与背景颜色
		unsigned SonCol{ 0x60 }; //子列表字体与背景颜色
		unsigned DefaultCol{ 0x10 };//标题字体与背景颜色
		std::string ListName;//列表的名称
		std::string* List;//存放选项名称
		std::string Title{ "欢迎使用TANXL_CONSOLE_LIST Version 1.2  WiChG_Trade" };//默认标题字符
	}MainList;
	inline void Free(MainList* Fun)//释放指针
	{
		delete Fun;
		Fun = NULL;
	}
	void MainList::SetCol(unsigned Scol, unsigned Ucol, unsigned Dcol, unsigned Ecol)//列表的颜色设置功能
	{
		this->SelectedCol = Scol;//选中物品栏的颜色
		this->UnSelectedCol = Ucol;//未选中的其他物品颜色
		this->DefaultCol = Dcol;//默认主题颜色
		this->SonCol = Ecol;//默认子列表颜色
	}
	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 < ListSize; i++)
		{
			ListStatus[i] = 0;
		}
		for (int i = ListSize; i < 50; i++)
		{
			ListStatus[i] = -1;
		}
		ListStatus[Start] = 1;
	}
	int MainList::DisplayList(int Switch, int Return, int LStart, int LEnd)//显示列表 ICUF_H_06中添加两个默认参数,可用于显示指定行
	{
		if (Switch == 3)
		{
			LStart = 0;
			LEnd = LimitEachPage;
		}
		int Start = (Page - 1) * LimitEachPage;
		int End = Start + LimitEachPage;
		int UnSeCol = UnSelectedCol;
		if (Switch == 1)//Switch值为1时 显示此页面的各种基本信息
			std::cout << "FunId: " << CheckCurrent() << "  Limit: " << LimitEachPage << "  Page: " << Page << "  Start: " << Start << "  End: " << End << std::endl << std::endl;
		if (Switch == 2)//Switch值为2时 输出子页面的列表 且使用子页面的颜色
			UnSeCol = SonCol;
		for (int i = Start + LStart; i < End + (LEnd - LimitEachPage); i++)
		{
			if (ListStatus[i] != -1)
			{
				if (ListStatus[i] == 1)
					Col(SelectedCol);
				else
					Col(UnSeCol);
				std::cout << std::setw((SSpace & 0xff0000) >> 16) << List[i] << std::setw((SSpace & 0x00ff00) >> 8) << " " << std::endl;
				if (Switch != 2)
					std::cout << std::endl;
				Col(0);
			}
		}
		if (Switch == 2)
			std::cout << std::endl;
		if (Return != 0)
			return InsertAction();
		else
			return 0;
	}
	int MainList::InsertAction()//输入控制
	{
		char Key;
		int Temp;
		Key = _getch();
		if (Key == 'c' || Key == 'C')//如果输入了大小写的C则返回上一级
			return 3;
		if (ListSize == 0)
			return 0;
		if ((int)(Key - 48) > 0 && (int)(Key - 48) <= 9)//判断是否是从零到九的数字
		{
			if ((int)(Key - 48) > ListSize)//如果是,且小于等于选项总数则直接指定这个选项
				InitList(ListSize - 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[ListSize - 1] = 1;
			}
			else if (Page != GetPages())
			{
				Page++;
				Temp = CheckCurrent();
				ListStatus[Temp] = 0;
				if (Temp + LimitEachPage >= ListSize - 1)
					ListStatus[ListSize - 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 < ListSize; j++)
		{
			if (ListStatus[j] == 1)
				return j;
		}
		return -1;
	}
	void MainList::Append(std::string FunctionName, int Times)//List数组添加String成员
	{
		if (Times != 0)
			return;
		List[ListSize] = FunctionName;
		ListSize += 1;//成员计数器
	}
	void MainList::RemoveAll()//用于移除List数组中的所有String成员
	{
		for (int i = 0; i < 10; i++)
		{
			List[i] = {};
			ListSize = 0;
		}
	}
	void MainList::SetLimit(int NewLimit)//设置每页的最大显示数量,超出范围则默认为9
	{
		LimitEachPage = NewLimit <= 0 ? 9 : NewLimit;
	}
	int MainList::GetPages()//获取总页面数
	{
		if (ListSize % LimitEachPage != 0)
			Pages = ListSize / LimitEachPage + 1;
		else
			Pages = ListSize / LimitEachPage;
		return Pages;
	}
	int MainList::GetLimit()//获取每页的最大显示数量
	{
		return LimitEachPage;
	}
	void MainList::MoveUp()//选项上移
	{
		int i = CheckCurrent();//找到当前指向的选项
		if (i == 0 && ListSize == 1)//如果只有一个选项则不变
			ListStatus[i] = 1;
		else if (i == 0 && ListSize != 1)//如果指向第一个且不止包含一个选项,则改为指向最下方的选项
		{
			ListStatus[i] = 0;
			Page = GetPages();
			ListStatus[ListSize - 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[ListSize - 1] = 1;
			}
		}
		else//正常情况
		{
			ListStatus[i] = 0;
			ListStatus[i - 1] = 1;
		}
	}
	void MainList::MoveDown()//选项下移
	{
		int i = CheckCurrent();//找到当前指向的选项
		if (i == 0 && ListSize == 1)//如果只有一个选项则不变
			ListStatus[i] = 1;
		else if (i != 0 && i == ListSize - 1)//如果指向最后一个且不止包含一个选项,则改为指向最上方的选项
		{
			ListStatus[ListSize - 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(std::string Name)
	{
		this->ListName = Name;
	}
	std::string MainList::GetListName()
	{
		return this->ListName;
	}
	void MainList::SetTitle(std::string Temp)
	{
		Title = Temp;
	}
	void MainList::ShowTitle()
	{
		Col(DefaultCol);
		std::cout << std::endl << std::endl << std::endl << std::endl;
		std::cout << std::setw((SSpace & 0xff0000) >> 16) << " " << std::setw(SSpace & 0x0000ff) << Title << std::setw((SSpace & 0x00ff00) >> 8) << " " << std::endl << std::endl; Col(0);
	}
	int MainList::DisplayListS(int Switch, int Return, int LStart, int LEnd)//显示列表 ICUF_H_06中添加两个默认参数,可用于显示指定行
	{
		if (Switch == 1)
		{
			LStart = 0;
			LEnd = LimitEachPage;
		}
		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);
				else
					Col(SonCol);
				std::cout << std::setw((SSpace & 0xff0000) >> 16) << List[i] << std::setw((SSpace & 0x00ff00) >> 8) << " " << std::endl;
				Col(0);
			}
		}
		std::cout << std::endl;
		if (Return != 0)
			ReturnS = InsertAction();
		else
			return 0;
		return ReturnS;
	}
	int MainList::GetListSize()
	{
		return ListSize;
	}
	int MainList::GetTimes()
	{
		return Times;
	}
	int MainList::GetTimeS()
	{
		return Times++;
	}
	int MainList::GetTempTimes()
	{
		return TempTimes;
	}
	void MainList::SetSpace(unsigned Spaces)
	{
		SSpace = Spaces;
	}
	void MainList::Resize()//扩展线性表容量
	{
		std::string* OldNames = List;
		ListMaxSize *= 2;
		List = new std::string[ListMaxSize];
		for (int i = 0; i < ListSize; i++)
			List[i] = OldNames[i];
	}
	MainList::MainList(int InitSize)//初始化线性表
	{
		ListMaxSize = InitSize;
		List = new std::string[ListMaxSize];
	}
	MainList::~MainList()//析构函数
	{
		delete[] List;
		ListSize = 0;
		List = NULL;
	}
}
#endif
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WiChP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值