IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++控制台强化实现一定界面效果(简洁版) -> 正文阅读

[C++知识库]C++控制台强化实现一定界面效果(简洁版)

TANXL_CONSOLE_LIST.H VERSION_1_4

在完成了游戏存档模块的开发之后,我试图用之前制作的Console_List头文件为基础,制作一个命令行上的数据管理器,但是在实际使用中我发现了Console_List的各种不足。比如提供了接口之后还需要用户输入大量的代码来完成表格的输出,明显不能做到让接口容易被正确使用,不易被误用。于是在这个背景下,我对Console_List进行了完全重写,在比前几代代码减少2/3的情况下,功能大幅加强,同时只需要一次物品初始化,一次调用显示函数,明显更加容易使用。

#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 VECTOR//检查是否已经包含VECTOR
#define VECTOR
#include <vector>
#endif

#ifndef CONIO_H//检查是否已经包含CONIO_H
#define CONIO_H
#include <conio.h>
#endif

#ifndef IOMANIP//检查是否已经包含IOMANIP
#define IOMANIP
#include <iomanip>
#endif
//void Col是原Console_List的核心功能,使用了Linux控制台的指令
void Col(unsigned ColN = NULL, bool Under_Line = false)//设置自定义行的背景颜色
{
	if (ColN == NULL)std::cout << "\033[0m";//清除颜色
	else
	{
		if (Under_Line == true)
			std::cout << "\033[7m";
		std::cout << "\033[4;1;m";
		if (((ColN & 0xf0) >> 4) > 0 && ((ColN & 0xf0) >> 4) <= 7)
			std::cout << "\033[3" << ((ColN & 0xf0) >> 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 & 0x0f) << "m";
		else if ((ColN & 0x0f) == 0);//值为0不作修改
		else//背景颜色: 1红色 2绿色 3橙色 4蓝色 5紫色 6淡蓝 7白色
			std::cout << "\033[4" << rand() % 7 + 1 << "m";
	}
}

//第三级别的物品结构
struct Function
{
	//void Page_Info() { Col(); std::cout << "This: " << Selector << " - Total: " << SonList.size() << " - Max: " << (SSpace & 0x0000ff) << std::endl; }
	Function() :Name("NULL"), /*SonList(NULL),*/ Func(NULL) {};
	Function(std::string N, void(*F)()) :Name(N),/* SonList(NULL),*/ Func(F) {};
	//int Selector{ 0 };
	//bool Is_Selected{ false };
	std::string Name;
	void(*Func)();
	unsigned SSpace{ 0x171109 };//选项和标题的空格数 AA-BB-CC AA左空格 BB右空格 CC页面物品限制数量
	//std::vector<Function>SonList;
};

//第二级别的物品结构
struct Main_Function
{
	void Page_Info() { Col(); std::cout << "This: " << Selector << " - Total: " << SonList.size() << " - Max: " << (SSpace & 0x0000ff) << std::endl; }
	Main_Function(std::string N = "NULL") :Name(N), SonList(NULL) {};
	Main_Function(std::string N, void(*F)()) :Name(N), SonList(NULL), Func(F) {};
	int Selector{ 0 };
	bool Is_Selected{ false };
	std::string Name;
	void(*Func)() { NULL };
	unsigned SSpace{ 0x171109 };//选项和标题的空格数 AA-BB-CC AA左空格 BB右空格 CC页面物品限制数量
	std::vector<Function>SonList;
};

//第一级别的主要物品类
class CONSOLE_LIST
{
public:
	void Display();
	void Append_Item(std::string New_Item) { SonList.push_back(Main_Function(New_Item)); };//添加二级物品作为选项
	//At用于指定第几个二级物品,后续两个量用于生成一个新的三级物品
	void Append_Svec(int At, std::string Name, void(*Func)()) { SonList.at(At).SonList.push_back(Function(Name, Func)); };//添加二级物品下的三级物品,同时绑定一个void类型的函数
private:
	void Page_Info() { Col(); std::cout << "This: " << Selector << " - Total: " << SonList.size() << " - Max: " << (SSpace & 0x0000ff) << std::endl; }//输出当前页面信息
	bool Insert_Action(int* Action_Num, bool* Action_Bol, size_t List_Size);//输入操作
	int Selector{ 0 };
	int Pages{ 0 };
	bool Is_Selected{ false };
	std::vector<Main_Function>SonList;
	unsigned SSpace{ 0x171109 };//选项和标题的空格数 AA-BB-CC AA左空格 BB右空格 CC页面物品限制数量
};

void CONSOLE_LIST::Display()
{
	Col();
	bool flag{ true };
	bool brea{ false };
	while (true)
	{
		if (!flag)
		{
			Is_Selected = false;
			flag = true;
			continue;
		}
		system("cls");
		int* Num{ &Selector };
		bool* Bol{ &Is_Selected };
		size_t Siz{ SonList.size() };
		for (int i = 0; i < SonList.size(); i++)
		{
			if (i == Selector)
				Col(0x71);
			else
				Col(0x17);
			std::cout << std::setw((SSpace & 0xff0000) >> 16) << SonList.at(i).Name << std::setw((SSpace & 0x00ff00) >> 8) << " " << std::endl;
			if (i == Selector && Is_Selected == true)
			{
				Pages = SonList.at(i).Selector / (SSpace & 0x0000ff);
				for (int j = Pages * (SSpace & 0x0000ff), count = 0; j < SonList.at(i).SonList.size() && count < (SSpace & 0x0000ff); j++&& count++)
				{
					if (j == SonList.at(i).Selector)
						Col(0x71);
					else
						Col(0x17);
					std::cout << std::setw((SSpace & 0xff0000) >> 16) << SonList.at(i).SonList.at(j).Name << std::setw((SSpace & 0x00ff00) >> 8) << " " << std::endl;
					if (SonList.at(i).Is_Selected == true && j == SonList.at(i).Selector)
					{
						SonList.at(i).SonList.at(j).Func();
						SonList.at(i).Is_Selected = false;
						brea = true;
						break;
					}
				}
				SonList.at(i).Page_Info();
				if (brea)
					break;
				Num = &SonList.at(i).Selector;
				Bol = &SonList.at(i).Is_Selected;
				Siz = SonList.at(i).SonList.size();
			}
			std::cout << std::endl;
		}
		Page_Info();
		if (brea)
		{
			brea = false;
			continue;
		}
		Col();
		flag = Insert_Action(Num, Bol, Siz);//等待输入
	}
}

bool CONSOLE_LIST::Insert_Action(int* Action_Num, bool* Action_Bol, size_t List_Size)
{
	char key = _getch();
	if (key == 'c' || key == 'C')//如果输入了大小写的C则返回上一级
	{
		*Action_Bol = false;
		return false;
	}
	if (static_cast<int>(key - 48) >= 0 && static_cast<int>(key - 48) <= 9)//判断是否是从零到九的数字
	{
		if (static_cast<int>(key - 48) <= List_Size)//如果是,且小于等于选项总数则直接指定这个选项
			*Action_Num = static_cast<int>(key - 48) - 1;
		else
			*Action_Num = static_cast<int>(List_Size) - 1;//如果超出了最大值,则指向最大值
		*Action_Bol = true;
	}
	else if (key == 'w' || key == 'W' || key == 72)//如果输入了大小写的W或者上箭头,则执行MoveUp函数
		*Action_Num = *Action_Num == 0 ? static_cast<int>(List_Size) - 1 : -- * Action_Num;
	else if (key == 's' || key == 'S' || key == 80)//如果输入了大小写的S或者下箭头,则执行MoveDown函数
		*Action_Num = *Action_Num == static_cast<int>(List_Size) - 1 ? 0 : ++ * Action_Num;
	else if (key == 'a' || key == 'A' || key == 75)//如果输入了大小写的A或者左箭头,则执行向上翻页函数
		*Action_Num = *Action_Num - static_cast<int>(SSpace & 0x0000ff) < 0 ? 0 : *Action_Num - (SSpace & 0x0000ff);
	else if (key == 'd' || key == 'D' || key == 77)//如果输入了大小写的D或者右箭头,则执行向下翻页函数
		*Action_Num = *Action_Num + (SSpace & 0x0000ff) > static_cast<int>(List_Size) - 1 ? static_cast<int>(List_Size) - 1 : *Action_Num + (SSpace & 0x0000ff);
	else if (key == '\r')//回车确认
		*Action_Bol = true;
	return true;
}

#endif

以下为使用例:

Main.cpp

#include "TANXL_CONSOLE_LIST.h"
void say()
{
    Col();
    system("cls");
    std::cout << "wdnmd";
    system("pause");
}
int main()
{
    CONSOLE_LIST TSM;
    TSM.Append_Item("数据管理");
    TSM.Append_Svec(0, "数据管理1", &say);
    TSM.Append_Svec(0, "数据管理2", &say);
    TSM.Append_Svec(0, "数据管理3", &say);
    TSM.Append_Svec(0, "数据管理4", &say);
    TSM.Append_Svec(0, "数据管理5", &say);
    TSM.Append_Svec(0, "数据管理6", &say);
    TSM.Append_Svec(0, "数据管理7", &say);
    TSM.Append_Svec(0, "数据管理8", &say);
    TSM.Append_Svec(0, "数据管理9", &say);
    TSM.Append_Svec(0, "数据管理10", &say);
    TSM.Append_Svec(0, "数据管理11", &say);
    TSM.Append_Svec(0, "数据管理12", &say);
    TSM.Append_Svec(0, "数据管理13", &say);
    TSM.Append_Svec(0, "数据管理14", &say);
    TSM.Append_Svec(0, "数据管理15", &say);
    TSM.Append_Item("添加数据");
    TSM.Append_Svec(1, "添加数据1", &say);
    TSM.Append_Svec(1, "添加数据2", &say);
    TSM.Append_Svec(1, "添加数据3", &say);
    TSM.Append_Item("查看数据");
    TSM.Append_Svec(2, "查看数据1", &say);
    TSM.Append_Svec(2, "查看数据2", &say);
    TSM.Append_Svec(2, "查看数据3", &say);
    TSM.Append_Item("修改数据");
    TSM.Append_Svec(3, "修改数据1", &say);
    TSM.Append_Svec(3, "修改数据2", &say);
    TSM.Append_Svec(3, "修改数据3", &say);
    TSM.Append_Item("退出程序");
    TSM.Append_Svec(4, "_-确认-_", &say);
    TSM.Append_Svec(4, "_-取消-_", &say);
    TSM.Display();
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-05 21:32:58  更:2022-02-05 21:34:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:03:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码