以下为主要的头文件代码,只需要在头文件中添加即可。
使用此头文件开发的实例可以参考: C++控制台模拟购物程序.
此头文件的更老版本可以参考: ICUF_HEAD_03.h.
此头文件的更新版本可以参考: ICUF_HEAD_05.h.
开发环境:Visual Studio 2019
ICUF_HEAD_04.h
此头文件在ICUF_HEAD_03.h的基础上将各种功能整合进了类,在保证实现的功能完全一致的情况下,使用ICUF_HEAD_04.h的源文件要比使用ICUF_HEAD_03.h的源文件少输入50%以上的代码,同时将包含大量重复代码的功能合并为了更简短的代码。在此头文件中实现了类似List的功能,用户只用在源文件中给某个已声明的类使用Append(“购买商品”)函数,即可向此类中包含的数组提供一个名为“购买商品”的成员,同时内部计算数组成员总数的数字加一。
//ICUF_HEAD_04.H
#ifndef ICUF_HEAD_04
#define ICUF_HEAD_04
#include<iostream>
#include<string>
#include<conio.h>
using namespace std;
inline void Col(int ColN)//设置自定义行的背景颜色
{
if (ColN == 0)cout << "\033[0m";//清除颜色
else
{
cout << "\033[04m\033[1m\033[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";//白色
}
}
class FunctionList
{
public:int FunctionNumbers = 0;//表示类中含有的字符串数量
public:void InitList(int Start = 0)//列表初始化函数,默认初始化第一个选项为选定状态
{
for (int i = 0; i < FunctionNumbers; i++)
{
ListStatus[i] = 0;
}
ListStatus[Start] = 1;
}
public:void DisplayList()//显示列表
{
for (int i = 0; i < FunctionNumbers; i++)
{
if (ListStatus[i] == 1)
Col(7);
else
Col(1);
cout << " " << List[i] << " " << endl << endl;
Col(0);
}
}
public:int InsertAction()//输入控制
{
char Key;
Key = _getch();
if ((int)(Key - 48) > 0 && (int)(Key - 48) <= 9)//判断是否是从零到九的数字
{
if ((int)(Key - 48) > FunctionNumbers)//如果是,且小于等于选项总数则直接指定这个选项
InitList(FunctionNumbers - 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 == 'z' || Key == 'Z')//头文件对Z,X,C,\r的功能只规定了返回值,可以由用户来决定其功能
return 1;
else if (Key == 'x' || Key == 'X')
return 2;
else if (Key == 'c' || Key == 'C')
return 3;
else if (Key == '\r')
return 4;
}
public:void MoveUp()//选项上移
{
int i = CheckCurrent();//找到当前指向的选项
if (i == 0 && FunctionNumbers == 1)//如果只有一个选项则不变
ListStatus[i] = 1;
else if (i == 0 && FunctionNumbers != 1)//如果指向第一个且不止包含一个选项,则改为指向最下方的选项
{
ListStatus[i] = 0;
ListStatus[FunctionNumbers - 1] = 1;
}
else//正常情况
{
ListStatus[i] = 0;
ListStatus[i - 1] = 1;
}
}
public:void MoveDown()//选项下移
{
int i = CheckCurrent();//找到当前指向的选项
if (i == 0 && FunctionNumbers == 1)//如果只有一个选项则不变
ListStatus[i] = 1;
else if (i != 0 && i == FunctionNumbers - 1)//如果指向最后一个且不止包含一个选项,则改为指向最上方的选项
{
ListStatus[FunctionNumbers - 1] = 0;
ListStatus[0] = 1;
}
else//正常情况
{
ListStatus[i] = 0;
ListStatus[i + 1] = 1;
}
}
public:int CheckCurrent()//找到当前指向的选项
{
for (int j = 0; j < FunctionNumbers; j++)
{
if (ListStatus[j] == 1)
return j;
}
}
public:void Append(string FunctionName)//List数组添加String成员
{
List[FunctionNumbers] = FunctionName;
FunctionNumbers += 1;//成员计数器
}
public:void RemoveAll()//移除所有成员
{
for (int i = 0; i < 10; i++)
{
List[i] = {};
FunctionNumbers = 0;
}
}
private:string List[10]{};//存放选项名称
private:int ListStatus[10]{};//存放选项状态
};
#endif
关于如何使用这个头文件,我提供了一个C++的源文件代码。
(C++控制台购物系统的壳子)
//ICUF_03.CPP
#include"ICUF_HEAD_04.h"
#define Version "0.00.__.__ "
#define Edition " ________ Edition "
FunctionList 主页,购买商品, 查询订单, 系统管理, 饰品百科, 退出系统;//声明类成员
void SystemMenu();
void SystemManage();
int main()
{
system("cls");
cout << "\n\n\n\n\n\n\n\n\n";
Col(1); cout << " \033[33m \033[31m \033[33m \033[31m \033[33m \033[31m \033[33m \033[31m \033[33m \033[31m \033[33m \033[31m " << endl; Col(0);
Col(2); cout << " \033[34m \033[32m \033[34m \033[32m \033[34m \033[32m \033[34m \033[32m \033[34m \033[32m \033[34m \033[32m" << Edition << endl; Col(0);
Col(3); cout << " \033[35m \033[33m \033[35m \033[33m \033[35m \033[33m \033[35m \033[33m \033[35m \033[33m \033[35m \033[33m \033[35m \033[33m ICUF Version " << Version << endl; Col(0);
Col(4); cout << " \033[36m \033[34m \033[36m \033[34m \033[36m \033[34m \033[36m \033[34m \033[36m \033[34m \033[36m \033[34m \033[36m \033[34m \033[36m \033[34m " << endl; Col(0);
Col(5); cout << " \033[37m \033[35m \033[37m \033[35m \033[37m \033[35m \033[37m \033[35m \033[37m \033[35m \033[37m \033[35m \033[37m \033[35m \033[37m \033[35m \033[37m \033[35m \033[37m \033[35m \033[37m \033[35m \033[37m \033[35m \033[37m \033[35m \033[37m \033[35m " << endl; Col(0);
Col(6); cout << " \033[31m \033[36m \033[31m \033[36m \033[31m \033[36m \033[31m \033[36m \033[31m \033[36m \033[31m \033[36m \033[31m \033[36m \033[31m \033[36m \033[31m \033[36m \033[31m \033[36m \033[31m \033[36m \033[31m \033[36m \033[31m \033[36m \033[31m \033[36m " << endl; Col(0);
Col(7); cout << " \033[32m \033[37m \033[32m \033[37m \033[32m \033[37m \033[32m \033[37m \033[32m \033[37m \033[32m \033[37m \033[32m \033[37m \033[32m \033[37m \033[32m \033[37m \033[32m \033[37m \033[32m \033[37m " << endl; Col(0);
Col(1); cout << " \033[33m \033[31m \033[33m \033[31m \033[33m \033[31m \033[33m \033[31m \033[33m \033[31m \033[33m \033[31m \033[33m \033[31m \033[33m \033[31m \033[33m \033[31m \033[33m \033[31m " << endl;
cout << "\n\n\n \a";
cout << "\n ";
system("pause"); Col(0);
SystemMenu();
return 0;
}
void SystemMenu()//系统主菜单
{
主页.RemoveAll();//移除所有物品,避免再次调用时多次添加
主页.Append("购买商品");//向主页中添加物品(选项)
主页.Append("查询订单");
主页.Append("系统管理");
主页.Append("饰品百科");
主页.Append("退出系统");
主页.InitList();//必要的初始化列表,漏掉就会导致程序出错!
while (1)
{
system("cls");
Col(1); cout << "\n\n\n\n 欢迎来到ICUF购物平台 WiChG_Trade \n\n"; Col(0);
主页.DisplayList();//显示列表
int i = 主页.InsertAction();//输入正常的上下和选项返回0,额外的功能则返回1,2,3,4
if (i == 1)
{
cout << "此页面没有上一页" << endl;
system("pause");
}
if (i == 2)
{
cout << "此页面没有下一页" << endl;
system("pause");
}
if (i == 3)
{
cout << "此页面没有前一页" << endl;
system("pause");
}
if (i == 4)
{
int i = 主页.CheckCurrent();//检查列表数组中当前数值为1(当前选定)的字符
if (i == 0)
SystemManage();
if (i == 4)
exit(1);
else
;
}
}
}
void SystemManage()//购买商品栏
{
购买商品.RemoveAll();//移除所有物品,避免再次调用时多次添加
购买商品.Append("价格管理");//向主页中添加物品(选项)
购买商品.Append("新增商品");
购买商品.Append("清除痕迹");
购买商品.Append("储存设置");
购买商品.Append("返回主页");
购买商品.InitList();//必要的初始化列表,漏掉就会导致程序出错!
while (1)
{
system("cls");
Col(1); cout << "\n\n\n\n Wild_Chicken_Programing \n\n"; Col(0);
购买商品.DisplayList();//显示列表
int i = 购买商品.InsertAction();//输入正常的上下和选项返回0,额外的功能则返回1,2,3,4
if (i == 1)
{
cout << "此页面没有上一页" << endl;
system("pause");
}
if (i == 2)
{
cout << "此页面没有下一页" << endl;
system("pause");
}
if (i == 3)
{
cout << "此页面没有前一页" << endl;
SystemMenu();
}
if (i == 4)
{
int i = 购买商品.CheckCurrent();//检查列表数组中当前数值为1(当前选定)的字符
if (i == 4)
SystemMenu();
else
;
}
}
}
以下为运行的一些截图
Wild_Chicken_Programing TANXL
TIPS:\033[33m等类似的代码在部分系统中会输出字符而不是颜色
2021/5/20 15:07 在56行添加了(return 4;)用以解决数字选择出现错误提示的问题。