用C代码设置Windows控制台颜色

举报
Apull 发表于 2023/12/21 18:00:25 2023/12/21
【摘要】 使用用C代码设置Windows控制台颜色

Windows控制台颜色

windows控制台中使用COLOR命令设置颜色,使用 COLOR -h 查看具体颜色值。

颜色说明

终端的颜色使用1个字节表示,高4位表示背景色,低4位表示前景色。颜色值范围为0-F,共16种颜色,分别为:

0 = 黑色       8 = 灰色
1 = 蓝色       9 = 淡蓝色
2 = 绿色       A = 淡绿色
3 = 浅绿色     B = 淡浅绿色
4 = 红色       C = 淡红色
5 = 紫色       D = 淡紫色
6 = 黄色       E = 淡黄色
7 = 白色       F = 亮白色

背景色和前景色可以互相搭配,比如蓝色背景,淡黄色文字表示为0x1D。

颜色示例

  • 命令提示符
    命令提示符

  • WindowsTerminal终端

WindowsTerminal终端

由于 WindowsTerminal终端可以自定义配色方案,因此显示的颜色与旧版的命令提示符显示的会有不同。

编程设置控制台颜色

使用Windows控制台API函数SetConsoleTextAttribute设置控制台颜色。

BOOL WINAPI SetConsoleTextAttribute(
  _In_ HANDLE hConsoleOutput,
  _In_ WORD   wAttributes
);

参数
	hConsoleOutput []
	控制台屏幕缓冲区的句柄。 该句柄必须具有 GENERIC_READ 访问权限。 
	
	 wAttributes [in]
	字符属性。

上面函数中要用到控制台句柄,使用Windows控制台API函数GetStdHandle获取控制台句柄。

GetStdHandle 函数
HANDLE WINAPI GetStdHandle(
  _In_ DWORD nStdHandle
);

参数
	nStdHandle []
	标准设备。 此参数的取值可为下列值之一:

		值								含义
	STD_INPUT_HANDLE((DWORD)-10)	标准输入设备。 最初,这是输入缓冲区 CONIN$ 的控制台。
	STD_OUTPUT_HANDLE((DWORD)-11)	标准输出设备。 最初,这是活动控制台屏幕缓冲区 CONOUT$。
	STD_ERROR_HANDLE((DWORD)-12)	标准错误设备。 最初,这是活动控制台屏幕缓冲区 CONOUT$。

代码

上面图片中各种颜色的实现代码


#include <stdio.h>
#include <windows.h>

//更改颜色
// color为每一种颜色所代表的数字,范围是0~15
void setColor(WORD color)
{
	HANDLE HOutput = GetStdHandle(STD_OUTPUT_HANDLE); //获取标准输出的句柄
	SetConsoleTextAttribute(HOutput, color); //设置颜色
}

int main()
{
	char *CLRNAME[] = {
		"黑色",
		"蓝色",
		"绿色",
		"浅绿色",
		"红色",
		"紫色",
		"黄色",
		"白色",
		"灰色",
		"淡蓝色",
		"淡绿色",
		"淡浅绿色",
		"淡红色",
		"淡紫色",
		"淡黄色",
		"亮白色",
	};

	printf("\n\n\t\t\t\t控制台文字颜色代码:");
	printf("\n\n");
	for (int i = 0; i <= 7; i++)
	{
		printf("\t\t");
		setColor(i == 0 ? 0xE0 : i);
		printf("%2X %-8s  海阔天空\t", i, CLRNAME[i]);
		setColor(i + 8);
		printf("\t%2X %-8s  海阔天空\n", i + 8, CLRNAME[i + 8]);
	}
	setColor(0x07); //默认颜色
	printf("\n\n\t\t\t\t控制台背景颜色代码:");
	printf("\n\n");
	for (int i = 0; i <= 7; i++)
	{
		printf("\t\t");
		setColor((i << 4) + (i == 0 ? 0xE : 0)); //把颜色值移到高位设置成背景色
		printf("%2X %-20s\t", i, CLRNAME[i]);
		setColor(0x07);
		printf("\t");
		setColor((i + 8) << 4);
		printf("%2X %-20s\n", i + 8, CLRNAME[i + 8]);
		setColor(0x07);
	}
	
	return 0;
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。