<知識分享>
在這里介紹一個設置文本屬性的函數,原型如下
- BOOL SetConsoleTextAttribute( // 設置WriteConsole等函數的字符屬性
- HANDLE hConsoleOutput, // 句柄
- WORD wAttributes // 文本屬性
- );
順便提一下文本屬性,其實就是顏色屬性,有背景色和前景色(就是字符的顏色)兩類,每一類只提供三原色(紅,綠,藍)和加強色(灰色,可與其他顏色搭配使用,使顏色變亮,后面會提到)。最后還有一個反色(不太清楚這個到底怎么用,很奇葩的東西)。示例程序如下:
- #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;
- }
上述示例程序最好用C++來中編譯,因為有C語言的編譯器或者IDE不支持上述的定義常量的方式。需要從這個示例中了解的是三原色的混合是用C語言位運算中的按位或 | 運算符,背景顏色與字符顏色的同時定義也是使用這個運算符融合。另外,將任意顏色與對應的加強色(灰色,有前景和背景兩種,需要對應)融合后會成為對應顏色的高亮版,比如紅色字符與前景加強色的融合會結合成亮紅色。
至於反色,大家可以試試,當我設置了文本屬性為反色后,輸入字符都不顯示了,但是下標還在移動,我估計反色將白色字符變成了黑色字符,與黑色背景一樣,所以沒有顯示出來。至於反色與其他的組合以及其他的顏色組合,還需要大家一起探索、、、