C语言控制台窗口界面编程:printf格式化显示-修改字符字体、颜色和背景

环境:cygwin-Linux+GCC

PS:windows的cmd下不能实现。

在linux终端中一个ls指令得出的显示结果文件夹、文件以及不同操作权限的文件的显示颜色是不同的,那么这个是如何实现的呢?


从上图中看到的,不同的颜色信息有助于判断不同的文件类型。以下面的printf格式化输出为例:

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char **argv)
{
        printf("\033[1m加粗\033[m\n");
	printf("\033[1;30m加粗黑色字体\033[m\n");
	printf("\033[1;30;41m加粗黑色字体红色背景\033[m\n");
	
        printf("\033[3m斜体\033[m\n");
	printf("\033[3;34m斜体深蓝色字体\033[m\n");
	printf("\033[3;34;47m斜体深蓝色字体白色背景\033[m\n");
	
        printf("\033[9m删除线\033[m\n");
	printf("\033[9;35m删除线紫色字体\033[m\n");
	printf("\033[9;35;43m删除线紫色字体黄色背景\033[m\n");
	
}

得到的输出结果为:


这是一个格式化输出的结果,其格式化为(原文链接):

/* \033[字符的显示方式;字符的颜色;字符的背景颜色m 需要显示的字符 \033[m */
	/* 字符的显示方式:
	0(默认值)、1(加粗)、2(灰显)、3(斜体)、4(下划线)、7(反显)、9(删除线)
       字符的颜色:
	30(黑色)、31(红色)、32(绿色)、 33(黄色)、34(深蓝色)、
	35(紫色)、36(浅蓝色)、37(白色)
       字符的背景颜色:
	40(黑色)、41(红色)、42(绿色)、 43(黄色)、44(蓝色)、
	45(紫色)、46(浅蓝色)、47(白色) */

当然也可以这么做:

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char **argv)
{
	int fontShowWay=0, fontColor, backgroundColor, count = 0;
	
	for ( fontShowWay = 0; fontShowWay <= 9; fontShowWay ++)
		for( fontColor = 30; fontColor <= 37; fontColor ++)
			for ( backgroundColor = 40; backgroundColor <= 47; backgroundColor ++) {
				count ++;
	printf("\033[%d;%d;%dm Hello World ! \033[m",fontShowWay, fontColor, backgroundColor);
				if(count%10 == 0)
					printf("\n");
			}
	
}




此外,这里有一篇文章C语言控制台窗口图形界面编程(三)

在windows系统下进行的字体变换,但是不太好理解。

#include <stdio.h>  
#include <stdlib.h>  
#include <windows.h>  
#include <conio.h>  
/* 
基本文本属性 
FOREGROUND_BLUE 蓝色 
FOREGROUND_GREEN 绿色 
FOREGROUND_RED 红色 
FOREGROUND_INTENSITY 加强 
BACKGROUND_BLUE 蓝色背景 
BACKGROUND_GREEN 绿色背景 
BACKGROUND_RED 红色背景 
BACKGROUND_INTENSITY 背景色加强 
COMMON_LVB_REVERSE_VIDEO 反色 
*/  
  
const WORD FORE_BLUE   = FOREGROUND_BLUE;           //蓝色文本属性  
const WORD FORE_GREEN  = FOREGROUND_GREEN;          //绿色文本属性  
const WORD FORE_RED    = FOREGROUND_RED;            //红色文本属性  
const WORD FORE_PURPLE = FORE_BLUE | FORE_RED;      //紫色文本属性  
const WORD FORE_CYAN   = FORE_BLUE | FORE_GREEN;    //青色文本属性  
const WORD FORE_YELLOW = FORE_RED | FORE_GREEN;     //黄色文本属性  
const WORD FORE_GRAY   = FOREGROUND_INTENSITY;      //灰色文本属性  
const WORD BACK_BLUE   = BACKGROUND_BLUE;           //蓝色背景属性  
const WORD BACK_GREEN  = BACKGROUND_GREEN;          //绿色背景属性  
const WORD BACK_RED    = BACKGROUND_RED;            //绿色背景属性  
const WORD BACK_PURPLE = BACK_BLUE | BACK_RED;      //紫色背景属性  
const WORD BACK_CYAN   = BACK_BLUE | BACK_GREEN;    //青色背景属性  
const WORD BACK_YELLOW = BACK_RED | BACK_GREEN;     //黄色背景属性  
const WORD BACK_GRAY   = BACKGROUND_INTENSITY;      //灰色背景属性  
  
int main()  
{  
    HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);    //获得标准输出设备句柄  
    CONSOLE_SCREEN_BUFFER_INFO csbi;                        //定义窗口缓冲区信息结构体  
    GetConsoleScreenBufferInfo(handle_out, &csbi);          //获得窗口缓冲区信息  
    SetConsoleTextAttribute(handle_out, FORE_BLUE);  
    printf("蓝色\n");  
    SetConsoleTextAttribute(handle_out, FORE_RED);  
    printf("红色字符\n");  
    SetConsoleTextAttribute(handle_out, FORE_GREEN);  
    printf("绿色字符\n");  
    SetConsoleTextAttribute(handle_out, FORE_PURPLE);  
    printf("紫色字符\n");  
    SetConsoleTextAttribute(handle_out, FORE_CYAN);  
    printf("青色字符\n");  
    SetConsoleTextAttribute(handle_out, FORE_YELLOW);  
    printf("黄色字符\n");  
    SetConsoleTextAttribute(handle_out, FORE_GRAY);  
    printf("灰色字符\n");  
    SetConsoleTextAttribute(handle_out, FORE_GREEN | FORE_BLUE | FORE_RED);  
    printf("白色字符\n");  
    SetConsoleTextAttribute(handle_out, BACK_BLUE);  
    printf("蓝色背景\n");  
    SetConsoleTextAttribute(handle_out, BACK_RED);  
    printf("红色背景\n");  
    SetConsoleTextAttribute(handle_out, BACK_GREEN);  
    printf("绿色背景\n");  
    SetConsoleTextAttribute(handle_out, BACK_PURPLE);  
    printf("紫色背景\n");  
    SetConsoleTextAttribute(handle_out, BACK_CYAN);  
    printf("青色背景\n");  
    SetConsoleTextAttribute(handle_out, BACK_YELLOW);  
    printf("黄色背景\n");  
    SetConsoleTextAttribute(handle_out, BACK_GRAY);  
    printf("灰色背景\n");  
    SetConsoleTextAttribute(handle_out, BACK_BLUE | BACK_RED | BACK_GREEN);  
    printf("白色背景\n");  
    SetConsoleTextAttribute(handle_out, BACK_GREEN | FORE_RED); //示例:绿色背景红色字符  
    printf("绿色背景与红色字符的混合\n");  
    SetConsoleTextAttribute(handle_out, FOREGROUND_INTENSITY | FORE_RED);   //示例:亮红色字符  
    printf("亮色的生成,与加强色融合\n");  
    return 0;  
} 

编译与运行:


  • 8
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值