當咱們在命令行輸出字符的時候,會想着,要是能控制輸出字符的顏色就行了。
如今,知足你,有這麼一個函數可以幫助咱們實現這個想法。
↓↓↓↓↓
SetConsoleTextAttribute();
html
依照慣例咱們來看看這個函數的構成。windows
SetConsoleTextAttribute( _In_ HANDLE hConsoleOutput, _In_ WORD wAttributes );
HANDLE在上一篇博客中咱們見過。注意在使用前,要先將其變爲標準輸出句柄。函數
typedef void *HANDLE;//HANDLE是vodi*的重定義 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//獲取標準輸出句柄
如今咱們主要來看一下WORD的定義。
typedef unsigned short WORD;
字體
從上能夠看出WORD實際上是個無符號的整型,通常這樣的話,線索就好像是斷了,只看數值的話只能知道取值範圍是0-65535。
可是咱們去網上搜索這個函數後,咱們就發現了簡單的用法,這裏我來舉個例子:命令行
#include <stdio.h> #include <windows.h> int main() { HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 獲取標準輸出句柄 SetConsoleTextAttribute(hOut, FOREGROUND_INTENSITY | FOREGROUND_BLUE);//字體設置爲藍色 printf("R\n"); }
咱們看到不只咱們輸出的字符"R"變成了藍色,且後面的自動彈出的提示也變成了藍色。
咱們能夠把輸出字符的命令看成是一支畫筆,而咱們經過SetConsoleTextAttribute();改變了畫筆的顏色。//這裏提醒一下,直到下次更改前顏色會一直保持
並且咱們能夠看到,原本應該是填入WORD類型數據的地方,如今變成了"FOREGROUND_INTENSITY | FOREGROUND_BLUE"。
這是什麼東西呢,咱們對它查看定義來看一下:code
#define FOREGROUND_BLUE 0x0001 // text color contains blue. #define FOREGROUND_GREEN 0x0002 // text color contains green. #define FOREGROUND_RED 0x0004 // text color contains red. #define FOREGROUND_INTENSITY 0x0008 // text color is intensified. #define BACKGROUND_BLUE 0x0010 // background color contains blue. #define BACKGROUND_GREEN 0x0020 // background color contains green. #define BACKGROUND_RED 0x0040 // background color contains red. #define BACKGROUND_INTENSITY 0x0080 // background color is intensified.
從看到上的的註釋不難看出,這些函數是對一些十六位進制的值的宏定義。//0x表明這後面的數字是十六位進制
並且根據宏定義名可簡單的歸類:
前四個是對字體的 藍色,綠色,紅色,亮度 進行設置
後四個是對背景的 藍色,綠色,紅色,亮度 進行設置htm
相信機智的你已經看出來了,SetConsoleTextAttribute(HANDLE,WORD);實際上是經過判斷WORD的二進制,其相對應位置上的值來開啓顏色屬性的。
(short是二字節,可是這裏方便書寫就寫一字節了)blog
對應屬性 | 藍色字體 | 綠色字體 | 紅色字體 | 高亮字體 | 藍色背景 | 綠色背景 | 紅色背景 | 高亮背景 |
---|---|---|---|---|---|---|---|---|
十進制 | 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
二進制 | 00000001 | 00000010 | 00000100 | 00001000 | 00010000 | 00100000 | 01000000 | 10000000 |
上訴例子裏的值也能夠這麼轉換下來:
" FOREGROUND_INTENSITY|FOREGROUND_BLUE "--->" 0x0008|0x0001 "--->" 00001000|00000001 "
--->"00001001"
而後根據"00001001"查看,哦,開啓第一位和第四位的屬性,那麼也就是打開啓 藍色字體和高亮字體的屬性。
還有就是 這裏的紅綠藍其實就是三原色,通過經過 紅綠 紅藍 綠藍 還可獲得 黃色 青色 粉色 這三種顏色。get
//宏定義字體顏色 #define FOREGROUND_WHITE 0x0007 //白色(紅+綠+藍) 默認顏色 #define FOREGROUND_YELLOW 0x0006 //黃色(紅+綠) #define FOREGROUND_PINK 0x0005 //粉色(紅+藍) #define FOREGROUND_INDIGO 0x0003 //青色(綠+藍)
這裏我把混合的顏色寫上來,能夠在本身的代碼裏添加這個宏定義方便使用混搭顏色博客