编译后弹出的黑框框(exe 可执行文件)总是黑底白字,在做实践大作业时想到尝试改变字体的颜色与背景色,搜索发现有system和SetConsoleTextAttribute两个函数,各有长处,详细了解一下,为了以后的使用。
操作平台:Microsoft Visual Studio 2019
[content]
system函数 (Windows系统)
函数功能
函数原型 (注:指令大小写均可)
函数参数规定
函数缺点
示例程序(system函数)
SetConsoleTextAttribute函数
函数头文件
函数功能
函数原型
函数参数
示例程序(SetConsoleTextAttribute函数)
system函数 (Windows系统)
系统函数,不用引其他的头文件
函数功能
发出一个DOS命令
- DOS命令——指DOS操作系统的命令,是一种面向磁盘的操作命令,主要包括目录操作类命令、磁盘操作类命令、文件操作类命令和其它命令。
调用color函数可以改变控制台的前景色和背景从而达到我们的目的,即设置默认的控制台前景和背景颜色。(还有以下功能举例);
- system("pause")可以实现冻结屏幕,便于观察程序的执行结果;
- system("CLS")可以实现清屏操作。(清屏后原数据不会被清除)
函数原型 (注:指令大小写均可)
//system函数原型
int system(const char *command);
//system实现color功能的函数定义语句
system("color 01"); //设置背景为黑色,字体为蓝色
函数参数规定
由函数原型可知system函数的参数为const char*类型,则使用时注意
- 【对于system函数而言】要在system的()内加""
- 【对于color函数而言】在""内color与所需输入的颜色属性中间用空格隔开,不能用逗号,也不能直接输入而不隔开
错误输入参数时会出现的情况:
- 直接输入system("colorf4");而不隔开时会出现如下:
- 用逗号时会出现system(“color ”)的功能及使用方式;
COLOR [attr]
/*attr 指定控制台输出的颜色属性*/
示例: "COLOR fc" 在亮白色上产生淡红色(即背景为白色,字体为红色)
//应用示例
system("color f4"); //红字白底
颜色属性由两个十六进制数字指定——第一个对应于背景,第二个对应于前景(字体)。
每个数字可以为以下任何值(淡色与原色相差不大,但是试的时候仔细观察一下亮度的确还是有差距的,大小写均可)
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 浅绿 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
特别注意:
①如果最初使用system("color")时没有给定任何参数(此处的参数是指attr,即颜色属性),此命令会将颜色还原到 CMD.EXE 启动时的颜色(即仍是原始的黑底白字)(这个值来自当前控制台窗口、/T 命令行开关或 DefaultColor 注册表值。);
②若在最后想把控制台还原到最初的黑底白字,不给参数是无法实现这一功能的,只能使用 system("color 07"); 还原到黑底白字,在最后使用system("color")不给参数是无法实现把颜色还原到黑底白字的;
③如果尝试使用相同的前景和背景颜色来执行COLOR 命令,COLOR 命令会将 ERRORLEVEL 设置为 1(即仍是黑底白字)。
函数缺点
运行下面示例程序会发现,system函数加上color函数这个指令后可以对控制台文本属性进行改变,但是一改变就是整个控制台发生变化,只能把控制台改成一种颜色,无法达到我们想要指定一行的文本发生颜色改变(即改成多种颜色)的效果,因此,有下面SetConsoleTextAttribute函数,这个函数更加灵活。
示例程序(system函数)
#include<iostream>
using namespace std;
int main() {
string q; //设置一个值便于观察颜色变化
system("COLOR f9"); //此处大写,设置为白底蓝字
cout << "hello" << endl;
cout << "观察中:";
cin >> q;
cout << endl;
system("color 05"); //此处小写,设置为黑底紫字
cout << "hello" << endl;
cout << "观察中:";
cin >> q;
cout << endl;
system("cls"); //试用system函数的其他指令提供的功能,也可以把这一行注释掉
cout << endl << "查看cls清屏后是否还能查看刚刚输入的数据" << endl << "输入的观察值为 q = " << q << endl;
system("color 07"); //还原为最初颜色,黑底白字
cout << endl << "观察结束,随便输入啦:";
cin >> q;
return 0;
}
SetConsoleTextAttribute函数
函数头文件
#include<Windows.h>
函数功能
设置控制台文本属性
函数原型
BOOL SetConsoleTextAttribute( HANDLE hConsoleOutput, WORD wAttributes );
函数参数
hConsoleOutput —— 控制台屏幕缓冲区的句柄
这里我们引入GetSTDHandle函数来作为参数
GetStdHandle(nStdHandle)是返回标准的输入、输出或错误的设备的句柄,也就是获得输入、输出/错误的屏幕缓冲区的句柄。
nStdHandle的值 | 含义 |
---|---|
STD_INPUT_HANDLE | 标准输入的句柄 |
STD_OUTPUT_HANDLE | 标准输出的句柄 |
STD_ERROR_HANDLE | 标准错误的句柄 |
wAttributes —— 字符属性,包括颜色和 DBCS (点击查询DBCS双字节字符)
Attribute | 含义 | 对应数字 |
---|---|---|
FOREGROUND_BLUE | 文本颜色包含蓝色。 | 1 |
FOREGROUND_GREEN | 文本颜色包含绿色。 | 2 |
FOREGROUND_RED | 文本颜色包含红色。 | 4 |
FOREGROUND_INTENSITY | 文本颜色增强 | 8 |
BACKGROUND_BLUE | 背景色包含蓝色。 | 16 |
BACKGROUND_GREEN | 背景色包含绿色。 | 32 |
BACKGROUND_RED | 背景色包含红色。 | 64 |
BACKGROUND_INTENSITY | 背景色增强。 | 128 |
COMMON_LVB_LEADING_BYTE | 前导字节。 | \ |
COMMON_LVB_TRAILING_BYTE | 尾随字节。 | \ |
COMMON_LVB_GRID_HORIZONTAL | 顶部水平。 | \ |
COMMON_LVB_GRID_LVERTICAL | 左垂直。 | \ |
COMMON_LVB_GRID_RVERTICAL | 右垂直。 | \ |
COMMON_LVB_REVERSE_VIDEO | 反转前景和背景属性。 | \ |
COMMON_LVB_UNDERSCORE | 下划线。 | \ |
前景属性指定文本颜色; 背景属性指定用于填充单元格背景的颜色; 其他属性与 DBCS 一起使用。
应用程序可以将前景常量和背景常量组合起来以实现不同的颜色,这个时候考察的就是绘画能力啦(红色+绿色= 黄色 ps:可以加高亮哦),使用 | 符号。
例如,以下组合实现:蓝色背景上的亮青色文本。
FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_BLUE
如果没有指定背景常量,则背景为黑色,如果没有指定前景常量,则文本为黑色。
例如,以下组合实现:白色背景上的黑色文本。 为背景指定了红色、绿色和蓝色,它们组合成白色背景。 没有为前景指定标志颜色,因此它为黑色。
BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED
更多详情见: 控制台屏幕缓冲区
【注】关于wAttributes 字符属性参数的写法有三种,如下:
//BACKGROUND代表背景,FOREGROUND代表前景
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);//设置黄色(红色+绿色)
//十六进制数字
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x04); //红色
//十进制数字
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2); //绿色
示例程序(SetConsoleTextAttribute函数)
#include<Windows.h>
int main() {
cout << "Hello ——this is the prime color" << endl;
cout << "先来看一哈青色的字儿:";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);//设置青色
cout << endl << "Hello World!" << endl;
string q;
cout << "来尝试随便输入一下吧(给你一个蓝底白字):";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_BLUE | FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); //设置蓝底白字
cin >> q;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);//没有给其他颜色,只给了文本增强,只有亮度稍微改变一下
cout <<endl<< "zai随便输入一下吧" << endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);//设置白色
cin >> q;
cout << endl << "自己尝试一下,写着玩儿叭,拜拜咯——" << endl;
return 0;
}
文章来源地址https://www.toymoban.com/news/detail-457328.html文章来源:https://www.toymoban.com/news/detail-457328.html
到了这里,关于【c++】设置控制台窗口字体颜色和背景色(system和SetConsoleTextAttribute函数 )的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!