C/C++ 中怎樣使用SetConsoleTextAttribute()函數來控制輸出字符的顏色

當我們在命令行輸出字符的時候,會想著,要是能控制輸出字符的顏色就好瞭。
現在,滿足你,有這麼一個函數能夠幫助我們實現這個想法。
↓↓↓↓↓
SetConsoleTextAttribute();

依照慣例我們來看看這個函數的構成。

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”。
這是什麼東西呢,我們對它查看定義來看一下:

#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代表這後面的數字是十六位進制
而且根據宏定義名可簡單的歸類:
前四個是對字體的 藍色,綠色,紅色,亮度 進行設置
後四個是對背景的 藍色,綠色,紅色,亮度 進行設置

相信機智的你已經看出來瞭,SetConsoleTextAttribute(HANDLE,WORD);其實是通過判斷WORD的二進制,其相對應位置上的值來開啟顏色屬性的。
(short是二字節,但是這裡方便書寫就寫一字節瞭)

對應屬性 藍色字體 綠色字體 紅色字體 高亮字體 藍色背景 綠色背景 紅色背景 高亮背景
十進制 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″查看,哦,開啟第一位和第四位的屬性,那麼也就是打開啟 藍色字體和高亮字體的屬性。
還有就是 這裡的紅綠藍其實就是三原色,經過通過 紅綠 紅藍 綠藍 還可得到 黃色 青色 粉色 這三種顏色。

//宏定義字體顏色
#define FOREGROUND_WHITE  0x0007 //白色(紅+綠+藍) 默認顏色
#define FOREGROUND_YELLOW  0x0006 //黃色(紅+綠)
#define FOREGROUND_PINK  0x0005 //粉色(紅+藍)
#define FOREGROUND_INDIGO  0x0003 //青色(綠+藍)

這裡我把混合的顏色寫上來,為瞭方便使用,可以在自己的代碼裡添加這個宏定義方便使用

到此這篇關於C/C++ 中怎樣使用SetConsoleTextAttribute()函數來控制輸出字符的顏色的文章就介紹到這瞭,更多相關C/C++控制輸出字符的顏色內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: