Win32控制台彩色字符输出

Posted mathtimes

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Win32控制台彩色字符输出相关的知识,希望对你有一定的参考价值。

我记得,原则上,Win32控制台不支持任何ANSI颜色.方法之一是用Console API实现.

1. Console API

BOOL WINAPI SetConsoleTextAttribute(
  _In_  HANDLE hConsoleOutput,  // 控制台输出流句柄
  _In_  WORD wAttributes        // 设置属性
);

hConsoleOutput [输入参数]

控制台屏幕的输出流的句柄(handle to console screen buffer)。

这个文件流的句柄必须有写入(GENERIC_READ)的权限。更多的信息,请查看MSDN上的Console Buffer Security and Access Rights

wAttributes [输入参数]

具体常见设置属性如下:

 

ValueMeaning
FOREGROUND_BLUE 0x0001 Text color contains blue.
FOREGROUND_GREEN 0x0002 Text color contains green.
FOREGROUND_RED 0x0004 Text color contains red.
FOREGROUND_INTENSITY 0x0008 Text color is intensified.
BACKGROUND_BLUE 0x0010 Background color contains blue.
BACKGROUND_GREEN 0x0020 Background color contains green.
BACKGROUND_RED 0x0040 Background color contains red.
BACKGROUND_INTENSITY 0x0080 Background color is intensified.
COMMON_LVB_LEADING_BYTE 0x0100 Leading byte.
COMMON_LVB_TRAILING_BYTE 0x0200 Trailing byte.
COMMON_LVB_GRID_HORIZONTAL 0x0400 Top horizontal.
COMMON_LVB_GRID_LVERTICAL 0x0800 Left vertical.
COMMON_LVB_GRID_RVERTICAL 0x1000 Right vertical.
COMMON_LVB_REVERSE_VIDEO 0x4000 Reverse foreground and background attribute.
COMMON_LVB_UNDERSCORE 0x8000 Underscore.
属性意义
FOREGROUND_BLUE 前景色包含 蓝色
FOREGROUND_GREEN 前景色包含 绿色
FOREGROUND_RED 前景色包含 红色
FOREGROUND_INTENSITY 前景色加强
BACKGROUND_BLUE 背景色包含 蓝色
BACKGROUND_GREEN 背景色包含 绿色
BACKGROUND_RED 背景色包含 红色
BACKGROUND_INTENSITY 背景色加强
COMMON_LVB_GRID_HORIZONTAL 顶部水平网格
COMMON_LVB_GRID_LVERTICAL 左竖直网格
COMMON_LVB_GRID_RVERTICAL 右竖直网格

COMMON_LVB_UNDERSCORE

下划线
 1 //来自https://www.cnblogs.com/lovelp/p/setconsoletextattribute.html
 2 #include <windows.h>  
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5    
 6 int main()  
 7 {  
 8     HANDLE hOut;  
 9  
10     //  获取输出流的句柄
11     hOut = GetStdHandle(STD_OUTPUT_HANDLE);    
12  
13     printf("普通颜色看看\\n");
14  
15     SetConsoleTextAttribute(hOut,  
16                             FOREGROUND_GREEN |      // 前景色_绿色
17                             FOREGROUND_INTENSITY ); // 前景色_加强
18     printf("设置了浅绿色.\\n");  
19     printf("并且完了之后就一直是浅绿色\\n");
20  
21     SetConsoleTextAttribute(hOut,  
22                             FOREGROUND_BLUE |       // 前景色_蓝色
23                             FOREGROUND_INTENSITY |  // 前景色_加强
24                             COMMON_LVB_UNDERSCORE); // 添加下划线
25     printf("文字蓝色,再加个下划线.\\n");    
26  
27     SetConsoleTextAttribute(hOut,  
28                             FOREGROUND_RED |        // 前景色_红色
29                             FOREGROUND_INTENSITY |  // 前景色_加强
30                             BACKGROUND_BLUE );      // 背景色_蓝色
31     printf("设置文字红色,背景蓝色\\n");  
32  
33     SetConsoleTextAttribute(hOut,  
34                             FOREGROUND_RED |            // 前景色_红色
35                             FOREGROUND_INTENSITY |      // 前景色_加强
36                             COMMON_LVB_GRID_LVERTICAL );// 网格_左_竖
37     printf("                      加 左 网格\\n");  
38  
39     SetConsoleTextAttribute(hOut,  
40                             FOREGROUND_RED |            // 前景色_红色
41                             FOREGROUND_INTENSITY |      // 前景色_加强
42                             COMMON_LVB_GRID_RVERTICAL );// 网格_右_竖  
43     printf("                      加 右 网格\\n");    
44  
45     SetConsoleTextAttribute(hOut,  
46                             FOREGROUND_RED |    // 前景色_红色
47                             FOREGROUND_GREEN |  // 前景色_绿色
48                             FOREGROUND_BLUE );  // 前景色_蓝色
49     printf("改回白色\\n");  
50  
51     system("pause");
52     return 0;  
53 }

 

2. 使用终端

3. Linux虚拟bash

以上是关于Win32控制台彩色字符输出的主要内容,如果未能解决你的问题,请参考以下文章

使用 ANSI / VT100 代码在 PowerShell 控制台中输出彩色文本

利用正则实现彩色控制台输出

为啥 termcolor 在 Windows 控制台中输出控制字符而不是彩色文本?

Linux拓展之输出彩色文本

在终端中输出彩色文字

Python猜拳小游戏 彩色控制台版