在這裡介紹一個設定文字屬性的函數,原型如下
BOOL SetConsoleTextAttribute( // 設定WriteConsole等函數的字元屬性 HANDLE hConsoleOutput, // 控制代碼 WORD wAttributes // 文字屬性 );
本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/C/
順便提一下文字屬性,其實就是顏色屬性,有背景色和前景色彩(就是字元的顏色)兩類,每一類只提供三原色(紅,綠,藍)和加強色(灰色,可與其他顏色搭配使用,使顏色變亮,後面會提到)。最後還有一個反色(不太清楚這個到底怎麼用,很奇葩的東西)。樣本程式如下:
#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語言位元運算中的按位或 | 運算子,背景顏色與字元顏色的同時定義也是使用這個運算子融合。另外,將任意顏色與對應的加強色(灰色,有前景和背景兩種,需要對應)融合後會成為對應顏色的高亮版,比如紅色字元與前景加強色的融合會結合成亮紅色。
至於反色,大家可以試試,當我設定了文字屬性為反色後,輸入字元都不顯示了,但是下標還在移動,我估計反色將白色字元變成了黑色字元,與黑色背景一樣,所以沒有顯示出來。至於反色與其他的組合以及其他的顏色組合,還需要大家一起探索、、、