C++控制台代码实现一定的界面效果Ⅱ

以下为主要的头文件代码,只需要在头文件中添加即可。

使用此头文件开发的实例可以参考: 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;)用以解决数字选择出现错误提示的问题。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
这是第三版,增加了大量关于键盘缓冲区操作和输入、输出操作的知识讲解,并修改了多处前两版中文字、语句错误的地方。 前两个版本由于我等级不够无法删除,此处留下前两版的地址,希望对大家有用。 第一版:http://download.csdn.net/source/3056070 第二版:http://download.csdn.net/source/3332359 以下为第三版本的目录: C/C++控制台界面编程(V 3) 1 目录 - 1 - 第一部分 控制台界面编程预备知识 1 1) Visual Studio 2005中控制台程序的类型 1 2) 转义字符及格式化输入、输出 1 a) 制表符\t 2 b) 回退字符\b 4 c) ASCII码表 6 d) 以%开头的格式控制符 9 e) 数据流的格式设置 10 3) C和C++库的输入、输出操作 12 a) stdio.h中的常用输入、输出函数 13 b) basic_stream中的输入、输出操作 13 4) 键盘缓冲区处理 15 5) 关于C/C++中的字符串拼接问题 17 6) 怎样从控制台复制粘贴文字 18 7) 将批处理bat转换为exe程序 18 8) 在Visual Studio 2005中设置控制台程序的图标 18 9) 重定向控制台程序的输出 19 第二部分 控制台界面编程详解 20 1) 概述 20 2) 控制台文本窗口编程的一般控制步骤 21 3) 控制台窗口操作函数 21 4) 文本属性操作 25 5) 文本输出 28 6) 文本操作示例 28 7) 滚动和移动 34 8) 光标操作 36 9) 读取键盘信息 37 10) 读取鼠标信息 44 11) 结束语 46 第三部分 附录 1 1) 分数等级划分工具 1 a) controlio.h文件 1 b) Main.c文件 5 2) 简易俄罗斯方块 6 a) 代码Main.c文件 7 3) 模拟实现可用鼠标、键盘控制的菜单和窗口 11 这是第三版,增加了大量关于键盘缓冲区操作和输入、输出操作的知识讲解,并修改了多处前两版中文字、语句错误的地方。 前两个版本由于我等级不够无法删除,此处留下前两版的地址,希望对大家有用。 第一版:http://download.csdn.net/source/3056070 第二版:http://download.csdn.net/source/3332359

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

WiChP

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

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

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

打赏作者

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

抵扣说明:

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

余额充值