Hello大家好!最近刚刚做完C语言的课程设计。在评分标准中有一项是展示界面美观整洁。学前端的我对花里胡哨的界面情有独钟,这里为大家简单介绍三种改变字体颜色的方法。
注意:本文中所有演示截图均来自VS 2022。
目录
改变C语言显示界面字体颜色的三种方式
system颜色函数
首先介绍的是最简单的一种更改颜色方式。但简单的同时,他的效果不会太灵活。
system 函数包含于 #include<stdlib.h> 头文件中。设置默认的控制台前景和背景颜色是它众多功能之一。基本语法如下:
system("color xy");
其中,x 和 y 为两个十六进制数字,分别用于设定背景色以及前景色(字体颜色)。注意 x 和 y 两个字符间没有空格也没有逗号,格式不标准时运行程序会打印出该函数的用法。x , y可以对应以下任意值:
0 = 黑色 | 4 = 红色 | 8 = 灰色 | C = 淡红色 |
1 = 蓝色 | 5 = 紫色 | 9 = 淡蓝色 | D = 淡紫色 |
2 = 绿色 | 6 = 黄色 | A = 淡绿色 | E = 淡黄色 |
3 = 浅绿色 | 7 = 白色 | B = 浅淡绿色 | F = 亮白色 |
如果没有给定任何参数,此命令会将颜色还原到 CMD.EXE 启动时的颜色。这个值来自当前控制台窗口、/T 命令行开关或 DefaultColor 注册表值。
如果尝试使用相同的前景和背景颜色来执行COLOR 命令,COLOR 命令会将 ERRORLEVEL 设置为 1。
值得注意的是,你可能在网上看到过别人使用 system 函数时引用了 #include<Windows.h> 头文件,并成功使用了 system 函数。#include<Windows.h> 主要针对操作系统,包含大多数对系统有用的函数,如 Sleep, system 等。#include<stdlib.h>主要包含了一些宏指令和动态函数,如free(),malloc()等。笔者猜想,两个头文可能包含有少数相同的函数,遇到这种函数的时候,两个头文件用哪个都可以。(凭空猜想,欢迎评论区指正)
现在我们运行一下程序试试吧!
#include<stdio.h>
#include<windows.h>
int main()
{
system("color EC");
printf("这是第一行\n");
system("color 74");
printf("这是第二行");
return 0;
}
结果如下:
哇缺!怎么回事!背景色是 7(白色),前景色是 4(红色),代码第五行完全没有参与感捏!这是因为 system 函数加上 color 指令 是对整个控制台的文本属性进行改变,只能把整个控制台改成一种颜色,无法达到同一页面显示多种颜色的效果。这也就是刚刚介绍这个函数时说“他的功能不会太灵活”的原因。那么有没有一种方式可以更加灵活地改变字体颜色呢?为此,我们引入下面两个方法。
\033特殊转义字符
what is \033 ?
八进制的 \033 即 ESC 符号,Windows 中,ESC的十进制为 \027,十六进制为 \x1b。学过 HTML 的同学可能会觉得 \033 的用法和前端的标签有些像,常常成对儿出现。标准语法如下:
\033[参数1;参数2;参数3m
该转义字符直接应用于printf()函数中,这串代码生效即意味着从程序执行到这里开始,后面所有的屏幕打印字符均以该代码指定的效果显示。所以一般使用\033 进行颜色改变后,应当使用 \033[0m 进行还原。参数 1 指定显示方式,参数 2 指定前景色(字体颜色),参数 3 指定背景色。参数 3 后紧接小写字母 m 表示结束。相关参数值与对应效果如下:
单值控制码(与颜色改变无关且不能与其他控制码同时使用)
控制码 | 效果 |
---|---|
\033[nA | 光标上移 n 行 |
\033[nB | 光标下移 n 行 |
\033[nC | 光标右移 n 列 |
\033[nD | 光标左移 n 列 |
\033[y;xH | 设置光标位置 |
\033[2J | 清屏 |
\033[k | 设置光标位置(y行,x列) |
\033[s | 保存光标位置 |
\033[u | 恢复光标位置 |
\033[?25l | 隐藏光标 |
\033[?25h | 显示光标 |
字体颜色(前景色)
控制码 | 字体效果 |
---|---|
\033[0m | 关闭所有属性 |
\033[1m | 设置字体 高亮度 |
\033[2m | 低亮(减弱)显示 |
\033[4m | 下划线 |
\033[5m | 闪烁 |
\033[7m | 反显 |
\033[8m | 消隐 |
\033[30m | 黑色 |
\033[31m | 红色 |
\033[32m | 绿色 |
\033[33m | 黄色 |
\033[34m | 蓝色 |
\033[35m | 紫色 |
\033[36m | 浅蓝色 |
\033[37m | 白色 |
背景颜色
控制码 | 背景效果 |
---|---|
\033[40m | 黑色 |
\033[41m | 红色 |
\033[42m | 绿色 |
\033[43m | 黄色 |
\033[44m | 蓝色 |
\033[45m | 紫色 |
\033[46m | 浅蓝色 |
\033[47m | 白色 |
你可能注意到了,显示方式,前景色,背景色不同含义的数值都是唯一的且没有重复。所以三个参数的书写先后顺序不做硬性要求,不过还是建议按照默认规范的格式书写。三个参数可以只写一到两个。
下面做一个简单的示范:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
printf("\033[43;1m高亮文字黄色背景\n");
printf("这是第二行\033[0m\n");
printf("\033[43;1m高亮文字黄色背景\033[0m\n");
printf("这是第四行\033[0m\n");
printf("这一行\033[43;1m作为测试\033[0m\n");
return 0;
}
\033在笔者无论蓝色还是红色的Dev C++中都无法正常工作,暂时没有找到原因和解决办法。有没有大佬可以评论区解答一手?
SetConsoleTextAttribute函数
函数头文件:#include<Windows.h>
和\033类似地,代码执行到该函数时,后面所有的屏幕打印字符均以该代码指定的效果显示。基本语法如下:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),前景色 | 背景色 | 前景加强 | 背景加强);
关于这个代码的用法,请戳下面链接查看大佬详解~
(我就是从这位大佬这里学的这个函数的用法)
本篇文章到此就结束咯,希望能对你有所帮助。浅点一手关注,下一周分享更多能把美观分拿满的小技巧。
留存问题:为什么\033代码在Dev C++中无法使用?期待在评论区得到大佬的解答。