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

當咱們在命令行輸出字符的時候,會想着,要是能控制輸出字符的顏色就行了。
如今,知足你,有這麼一個函數可以幫助咱們實現這個想法。
↓↓↓↓↓
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  //青色(綠+藍)

這裏我把混合的顏色寫上來,能夠在本身的代碼裏添加這個宏定義方便使用混搭顏色博客

相關文章
相關標籤/搜索