优化C++控制台输出字体颜色方法

本文最后更新于:3 个月前

C++的系统调用输出颜色的方法参数很冗长,而且没有中文注释,很不方便,所以进行了优化处理,各位可以直接复制保存使用。

优化C++控制台输出字体颜色方法

所用工具为:Microsoft Virtual Studio

原版

字体颜色:

使用方法:先包含windows头文件Windows.h

必须在方法体内:

1
2
3
4
//调用此方法设置参数
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
//颜色参数之间用|分隔
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED);
文本颜色 参数
红色 FOREGROUND_RED
绿色 FOREGROUND_GREEN
蓝色 FOREGROUND_BLUE
白色 FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED
天蓝色 FOREGROUND_BLUE | FOREGROUND_GREEN
黄色 FOREGROUND_GREEN | FOREGROUND_RED
粉色 FOREGROUND_RED | FOREGROUND_BLUE
颜色增强 FOREGROUND_INTENSITY

字体背景颜色:

使用方法同字体颜色,主要是参数不一样

使用方法:先包含windows头文件Windows.h

必须在方法体内:

1
2
3
4
//调用此方法设置参数
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_RED);
//颜色参数之间用|分隔
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED);

注:相关参数源码是用宏定义的,不可修改

背景颜色 参数
红色 BACKGROUND_RED
绿色 BACKGROUND_GREEN
蓝色 BACKGROUND_BLUE
白色 BACKGROUND_BLUE | BACKGROUND_GREEN |BACKGROUND_RED
天蓝色 BACKGROUND_BLUE | BACKGROUND_GREEN
黄色 BACKGROUND_GREEN | BACKGROUND_RED
粉色 BACKGROUND_RED | BACKGROUND_BLUE
颜色增强 BACKGROUND_INTENSITY

注:

  • 相关参数源码是用宏定义的,不可修改。
  • 颜色为三基色,且不可与非颜色增强的混合搭配,即要么都增强,要么都不增强
  • 设置后,后面的就全是这个颜色了
1
2
3
4
5
6
7
8
9
10
11
12
//
// Attributes flags:
//

#define FOREGROUND_BLUE 0x0001 // text color contains blue.
#define FOREGROUND_GREEN 0x0002 // text color contains green.
#define FOREGROUND_RED 0x0004 // text color contains red.
#define FOREGROUND_INTENSITY 0x0008 // text color is intensified.
#define BACKGROUND_BLUE 0x0010 // background color contains blue.
#define BACKGROUND_GREEN 0x0020 // background color contains green.
#define BACKGROUND_RED 0x0040 // background color contains red.
#define BACKGROUND_INTENSITY 0x0080 // background color is intensified.

简化版

由于方法参数很长,不便使用,因此进行了简化。

使用方法:

  • 只需要创建个头文件,名称自定义,例如printcolor,然后复制下面的代码粘贴。
  • 在源文件内包含此头文件printcolor.h,然后打印输出前调用方法setTextColor()设置字体颜色,调用方法setTextBackgroundColor()设置字体背景颜色,传入相应的string类型的英文颜色字符串即可。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
#pragma once//防止头文件重复包含
#include<iostream>
#include<Windows.h>

using namespace std;

/*
注意:
设置后,在此之后输出的都将是设置的颜色。
若再想恢复默认颜色,可通过不传参数执行此方法恢复默认颜色。
*/

/*
设置字体颜色:
方法支持15种颜色(请传入相应的英文参数):
0、浅白色:littlewhite
1、红色:red 2、绿色:green 3、蓝色:blue
4、白色: white 5、天蓝色:skyblue 6、黄色:yellow
7、粉色: pink
11、亮红色:lightred 12、亮绿色:lightgreen 13、亮蓝色:lightblue
14、亮白色: lightwhite 15、亮天蓝色:lightskyblue 16、亮黄色:lightyellow
17、亮粉色: lightpink
其它参数或不传参数:默认色(白色)
*/
void setTextColor(string color = "white")
{
//设置Windows控制台打印颜色
int num = 4;
if (color == "littlewhite")
{
num = 0;
}
else if (color == "red")
{
num = 1;
}
else if (color == "green")
{
num = 2;
}
else if (color == "blue")
{
num = 3;
}
else if (color == "white")
{
num = 4;
}
else if (color == "skyblue")
{
num = 5;
}
else if (color == "yellow")
{
num = 6;
}
else if (color == "pink")
{
num = 7;
}
else if (color == "lightred")
{
num = 11;
}
else if (color == "lightgreen")
{
num = 12;
}
else if (color == "lightblue")
{
num = 13;
}
else if (color == "lightwhite")
{
num = 14;
}
else if (color == "lightskyblue")
{
num = 15;
}
else if (color == "lightyellow")
{
num = 16;
}
else if (color == "lightpink")
{
num = 17;
}
else
{
num = 4;
}

switch (num)
{
case 0://浅白色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);
break;
case 1://红色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
break;
case 2://绿色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
break;
case 3://蓝色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE);
break;
case 4://白色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED);
break;
case 5://天蓝色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE | FOREGROUND_GREEN);
break;
case 6://黄色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_RED);
break;
case 7://粉色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE | FOREGROUND_RED);
break;
case 11://增强红色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
break;
case 12://增强绿色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
break;
case 13://增强蓝色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
break;
case 14://增强白色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED);
break;
case 15://增强天蓝色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE | FOREGROUND_GREEN);
break;
case 16://增强黄色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED);
break;
case 17://增强粉色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE | FOREGROUND_RED);
break;
default://默认
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED);
break;
}
}

/*
设置字体背景色:
方法支持15种颜色(请传入相应的英文参数):
0、浅白色:littlewhite
1、红色:red 2、绿色:green 3、蓝色:blue
4、白色: white 5、天蓝色:skyblue 6、黄色:yellow
7、粉色: pink
11、亮红色:lightred 12、亮绿色:lightgreen 13、亮蓝色:lightblue
14、亮白色: lightwhite 15、亮天蓝色:lightskyblue 16、亮黄色:lightyellow
17、亮粉色: lightpink
注意:背景色一旦设置,就恢复不了原来的黑色字体背景了,除非不设置背景色
*/
void setTextBackgroundColor(string color = "white")
{
//设置Windows控制台打印颜色
int num = 4;
if (color == "littlewhite")
{
num = 0;
}
else if (color == "red")
{
num = 1;
}
else if (color == "green")
{
num = 2;
}
else if (color == "blue")
{
num = 3;
}
else if (color == "white")
{
num = 4;
}
else if (color == "skyblue")
{
num = 5;
}
else if (color == "yellow")
{
num = 6;
}
else if (color == "pink")
{
num = 7;
}
else if (color == "lightred")
{
num = 11;
}
else if (color == "lightgreen")
{
num = 12;
}
else if (color == "lightblue")
{
num = 13;
}
else if (color == "lightwhite")
{
num = 14;
}
else if (color == "lightskyblue")
{
num = 15;
}
else if (color == "lightyellow")
{
num = 16;
}
else if (color == "lightpink")
{
num = 17;
}
else
{
num = 4;
}

switch (num)
{
case 0://浅白色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_INTENSITY);
break;
case 1://红色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_RED);
break;
case 2://绿色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_GREEN);
break;
case 3://蓝色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_BLUE);
break;
case 4://白色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED);
break;
case 5://天蓝色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_BLUE | BACKGROUND_GREEN);
break;
case 6://黄色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_GREEN | BACKGROUND_RED);
break;
case 7://粉色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_BLUE | BACKGROUND_RED);
break;
case 11://增强红色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_INTENSITY | BACKGROUND_RED);
break;
case 12://增强绿色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_INTENSITY | BACKGROUND_GREEN);
break;
case 13://增强蓝色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_INTENSITY | BACKGROUND_BLUE);
break;
case 14://增强白色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_INTENSITY | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED);
break;
case 15://增强天蓝色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_INTENSITY | BACKGROUND_BLUE | BACKGROUND_GREEN);
break;
case 16://增强黄色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_INTENSITY | BACKGROUND_GREEN | BACKGROUND_RED);
break;
case 17://增强粉色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_INTENSITY | BACKGROUND_BLUE | BACKGROUND_RED);
break;
default://默认
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED);
break;
}
}

示例:源文件demo.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include"printcolor.h"

void test()
{
setTextColor("red");
cout << "红色字体:***************" << endl;
setTextColor("green");
cout << "绿色字体:***************" << endl;
setTextColor("blue");
cout << "蓝色字体:***************" << endl;
setTextColor("white");
cout << "白色字体:***************" << endl;
setTextColor("skyblue");
cout << "天蓝色字体:***************" << endl;
setTextColor("yellow");
cout << "黄色字体:***************" << endl;
setTextColor("pink");
cout << "粉色字体:***************" << endl;

setTextColor("lightred");
cout << "亮红色字体:***************" << endl;
setTextColor("lightgreen");
cout << "亮绿色字体:***************" << endl;
setTextColor("lightblue");
cout << "亮蓝色字体:***************" << endl;
setTextColor("lightwhite");
cout << "亮白色字体:***************" << endl;
setTextColor("lightskyblue");
cout << "亮天蓝色字体:***************" << endl;
setTextColor("lightyellow");
cout << "亮黄色字体:***************" << endl;
setTextColor("lightpink");
cout << "亮粉色字体:***************" << endl;


setTextBackgroundColor("red");
cout << "字体红色背景:***************" << endl;
setTextBackgroundColor("green");
cout << "字体绿色背景:***************" << endl;
setTextBackgroundColor("blue");
cout << "字体蓝色背景:***************" << endl;
setTextBackgroundColor("white");
cout << "字体白色背景:***************" << endl;
setTextBackgroundColor("skyblue");
cout << "字体天蓝色背景:***************" << endl;
setTextBackgroundColor("yellow");
cout << "字体黄色背景:***************" << endl;
setTextBackgroundColor("pink");
cout << "字体粉色背景:***************" << endl;

setTextBackgroundColor("lightred");
cout << "字体亮红色背景:***************" << endl;
setTextBackgroundColor("lightgreen");
cout << "字体亮绿色背景:***************" << endl;
setTextBackgroundColor("lightblue");
cout << "字体亮蓝色背景:***************" << endl;
setTextBackgroundColor("lightwhite");
cout << "字体亮白色背景:***************" << endl;
setTextBackgroundColor("lightskyblue");
cout << "字体亮天蓝色背景:***************" << endl;
setTextBackgroundColor("lightyellow");
cout << "字体亮黄色背景:***************" << endl;
setTextBackgroundColor("lightpink");
cout << "字体亮粉色背景:***************" << endl;
}

int main()
{
test();
system("pause");
return 0;
}

优化C++控制台输出字体颜色方法
https://superlovelace.top/2023/10/01/C++ConsoleTextColor/
作者
棱境
发布于
2023年10月1日
更新于
2023年10月31日
许可协议