C语言控制台窗口图形界面编程(三):文本属性

       在这里介绍一个设置文本属性的函数,原型如下

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("蓝色字符
");
40     SetConsoleTextAttribute(handle_out, FORE_RED);
41     printf("红色字符
");
42     SetConsoleTextAttribute(handle_out, FORE_GREEN);
43     printf("绿色字符
");
44     SetConsoleTextAttribute(handle_out, FORE_PURPLE);
45     printf("紫色字符
");
46     SetConsoleTextAttribute(handle_out, FORE_CYAN);
47     printf("青色字符
");
48     SetConsoleTextAttribute(handle_out, FORE_YELLOW);
49     printf("黄色字符
");
50     SetConsoleTextAttribute(handle_out, FORE_GRAY);
51     printf("灰色字符
");
52     SetConsoleTextAttribute(handle_out, FORE_GREEN | FORE_BLUE | FORE_RED);
53     printf("白色字符
");
54     SetConsoleTextAttribute(handle_out, BACK_BLUE);
55     printf("蓝色背景
");
56     SetConsoleTextAttribute(handle_out, BACK_RED);
57     printf("红色背景
");
58     SetConsoleTextAttribute(handle_out, BACK_GREEN);
59     printf("绿色背景
");
60     SetConsoleTextAttribute(handle_out, BACK_PURPLE);
61     printf("紫色背景
");
62     SetConsoleTextAttribute(handle_out, BACK_CYAN);
63     printf("青色背景
");
64     SetConsoleTextAttribute(handle_out, BACK_YELLOW);
65     printf("黄色背景
");
66     SetConsoleTextAttribute(handle_out, BACK_GRAY);
67     printf("灰色背景
");
68     SetConsoleTextAttribute(handle_out, BACK_BLUE | BACK_RED | BACK_GREEN);
69     printf("白色背景
");
70     SetConsoleTextAttribute(handle_out, BACK_GREEN | FORE_RED); //示例:绿色背景红色字符
71     printf("绿色背景与红色字符的混合
");
72     SetConsoleTextAttribute(handle_out, FOREGROUND_INTENSITY | FORE_RED);   //示例:亮红色字符
73     printf("亮色的生成,与加强色融合
");
74     return 0;
75 }

       上述示例程序最好用C++来中编译,因为有C语言的编译器或者IDE不支持上述的定义常量的方式。需要从这个示例中了解的是三原色的混合是用C语言位运算中的按位或 | 运算符,背景颜色与字符颜色的同时定义也是使用这个运算符融合。另外,将任意颜色与对应的加强色(灰色,有前景和背景两种,需要对应)融合后会成为对应颜色的高亮版,比如红色字符与前景加强色的融合会结合成亮红色。


       至于反色,大家可以试试,当我设置了文本属性为反色后,输入字符都不显示了,但是下标还在移动,我估计反色将白色字符变成了黑色字符,与黑色背景一样,所以没有显示出来。至于反色与其他的组合以及其他的颜色组合,还需要大家一起探索、、、

原文地址:https://www.cnblogs.com/JZQT/p/3802438.html