在这里介绍一个设置文本属性的函数,原型如下
1 BOOL SetConsoleTextAttribute( // 设置WriteConsole等函数的字符属性 2 HANDLE hConsoleOutput, // 句柄 3 WORD wAttributes // 文本属性 4 );
顺便提一下文本属性,其实就是颜色属性,有背景色和前景色(就是字符的颜色)两类,每一类只提供三原色(红,绿,蓝)和加强色(灰色,可与其他颜色搭配使用,使颜色变亮,后面会提到)。最后还有一个反色(不太清楚这个到底怎么用,很奇葩的东西)。示例程序如下:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <windows.h> 4 #include <conio.h> 5 /* 6 基本文本属性 7 FOREGROUND_BLUE 蓝色 8 FOREGROUND_GREEN 绿色 9 FOREGROUND_RED 红色 10 FOREGROUND_INTENSITY 加强 11 BACKGROUND_BLUE 蓝色背景 12 BACKGROUND_GREEN 绿色背景 13 BACKGROUND_RED 红色背景 14 BACKGROUND_INTENSITY 背景色加强 15 COMMON_LVB_REVERSE_VIDEO 反色 16 */ 17 18 const WORD FORE_BLUE = FOREGROUND_BLUE; //蓝色文本属性 19 const WORD FORE_GREEN = FOREGROUND_GREEN; //绿色文本属性 20 const WORD FORE_RED = FOREGROUND_RED; //红色文本属性 21 const WORD FORE_PURPLE = FORE_BLUE | FORE_RED; //紫色文本属性 22 const WORD FORE_CYAN = FORE_BLUE | FORE_GREEN; //青色文本属性 23 const WORD FORE_YELLOW = FORE_RED | FORE_GREEN; //黄色文本属性 24 const WORD FORE_GRAY = FOREGROUND_INTENSITY; //灰色文本属性 25 const WORD BACK_BLUE = BACKGROUND_BLUE; //蓝色背景属性 26 const WORD BACK_GREEN = BACKGROUND_GREEN; //绿色背景属性 27 const WORD BACK_RED = BACKGROUND_RED; //绿色背景属性 28 const WORD BACK_PURPLE = BACK_BLUE | BACK_RED; //紫色背景属性 29 const WORD BACK_CYAN = BACK_BLUE | BACK_GREEN; //青色背景属性 30 const WORD BACK_YELLOW = BACK_RED | BACK_GREEN; //黄色背景属性 31 const WORD BACK_GRAY = BACKGROUND_INTENSITY; //灰色背景属性 32 33 int main() 34 { 35 HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE); //获得标准输出设备句柄 36 CONSOLE_SCREEN_BUFFER_INFO csbi; //定义窗口缓冲区信息结构体 37 GetConsoleScreenBufferInfo(handle_out, &csbi); //获得窗口缓冲区信息 38 SetConsoleTextAttribute(handle_out, FORE_BLUE); 39 printf("蓝色字符\n"); 40 SetConsoleTextAttribute(handle_out, FORE_RED); 41 printf("红色字符\n"); 42 SetConsoleTextAttribute(handle_out, FORE_GREEN); 43 printf("绿色字符\n"); 44 SetConsoleTextAttribute(handle_out, FORE_PURPLE); 45 printf("紫色字符\n"); 46 SetConsoleTextAttribute(handle_out, FORE_CYAN); 47 printf("青色字符\n"); 48 SetConsoleTextAttribute(handle_out, FORE_YELLOW); 49 printf("黄色字符\n"); 50 SetConsoleTextAttribute(handle_out, FORE_GRAY); 51 printf("灰色字符\n"); 52 SetConsoleTextAttribute(handle_out, FORE_GREEN | FORE_BLUE | FORE_RED); 53 printf("白色字符\n"); 54 SetConsoleTextAttribute(handle_out, BACK_BLUE); 55 printf("蓝色背景\n"); 56 SetConsoleTextAttribute(handle_out, BACK_RED); 57 printf("红色背景\n"); 58 SetConsoleTextAttribute(handle_out, BACK_GREEN); 59 printf("绿色背景\n"); 60 SetConsoleTextAttribute(handle_out, BACK_PURPLE); 61 printf("紫色背景\n"); 62 SetConsoleTextAttribute(handle_out, BACK_CYAN); 63 printf("青色背景\n"); 64 SetConsoleTextAttribute(handle_out, BACK_YELLOW); 65 printf("黄色背景\n"); 66 SetConsoleTextAttribute(handle_out, BACK_GRAY); 67 printf("灰色背景\n"); 68 SetConsoleTextAttribute(handle_out, BACK_BLUE | BACK_RED | BACK_GREEN); 69 printf("白色背景\n"); 70 SetConsoleTextAttribute(handle_out, BACK_GREEN | FORE_RED); //示例:绿色背景红色字符 71 printf("绿色背景与红色字符的混合\n"); 72 SetConsoleTextAttribute(handle_out, FOREGROUND_INTENSITY | FORE_RED); //示例:亮红色字符 73 printf("亮色的生成,与加强色融合\n"); 74 return 0; 75 }
上述示例程序最好用C++来中编译,因为有C语言的编译器或者IDE不支持上述的定义常量的方式。需要从这个示例中了解的是三原色的混合是用C语言位运算中的按位或 | 运算符,背景颜色与字符颜色的同时定义也是使用这个运算符融合。另外,将任意颜色与对应的加强色(灰色,有前景和背景两种,需要对应)融合后会成为对应颜色的高亮版,比如红色字符与前景加强色的融合会结合成亮红色。
至于反色,大家可以试试,当我设置了文本属性为反色后,输入字符都不显示了,但是下标还在移动,我估计反色将白色字符变成了黑色字符,与黑色背景一样,所以没有显示出来。至于反色与其他的组合以及其他的颜色组合,还需要大家一起探索、、、