C/C++ 中怎樣使用SetConsoleTextAttribute()函數(shù)來控制輸出字符的顏色
當(dāng)我們在命令行輸出字符的時候,會想著,要是能控制輸出字符的顏色就好了。
現(xiàn)在,滿足你,有這么一個函數(shù)能夠幫助我們實現(xiàn)這個想法。
↓↓↓↓↓
SetConsoleTextAttribute();
依照慣例我們來看看這個函數(shù)的構(gòu)成。
SetConsoleTextAttribute( _In_ HANDLE hConsoleOutput, _In_ WORD wAttributes );
HANDLE在上一篇博客中我們見過。注意在使用前,要先將其變?yōu)闃藴瘦敵鼍浔?/p>
typedef void *HANDLE;//HANDLE是vodi*的重定義 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//獲取標準輸出句柄
現(xiàn)在我們主要來看一下WORD的定義。
typedef unsigned short WORD;
從上可以的除WORD其實是個無符號的整型,一般這樣的話,線索就好像是斷了,只看數(shù)值的話只能知道取值范圍是0-65535。
但是我們?nèi)ゾW(wǎng)上搜索這個函數(shù)后,我們就發(fā)現(xiàn)了簡單的用法,這里我來舉個例子:
#include <stdio.h>
#include <windows.h>
int main() {
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 獲取標準輸出句柄
SetConsoleTextAttribute(hOut, FOREGROUND_INTENSITY | FOREGROUND_BLUE);//字體設(shè)置為藍色
printf("R\n");
}

我們看到不僅我們輸出的字符"R"變成了藍色,且后面的自動彈出的提示也變成了藍色。
我們可以把輸出字符的命令當(dāng)作是一支畫筆,而我們通過SetConsoleTextAttribute();改變了畫筆的顏色。//這里提醒一下,直到下次更改前顏色會一直保持
而且我們可以看到,本來應(yīng)該是填入WORD類型數(shù)據(jù)的地方,現(xiàn)在變成了"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.
從看到上的的注釋不難看出,這些函數(shù)是對一些十六位進制的值的宏定義。//0x代表這后面的數(shù)字是十六位進制
而且根據(jù)宏定義名可簡單的歸類:
前四個是對字體的 藍色,綠色,紅色,亮度 進行設(shè)置
后四個是對背景的 藍色,綠色,紅色,亮度 進行設(shè)置
相信機智的你已經(jīng)看出來了,SetConsoleTextAttribute(HANDLE,WORD);其實是通過判斷WORD的二進制,其相對應(yīng)位置上的值來開啟顏色屬性的。
(short是二字節(jié),但是這里方便書寫就寫一字節(jié)了)
| 對應(yīng)屬性 | 藍色字體 | 綠色字體 | 紅色字體 | 高亮字體 | 藍色背景 | 綠色背景 | 紅色背景 | 高亮背景 |
|---|---|---|---|---|---|---|---|---|
| 十進制 | 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 |
| 二進制 | 00000001 | 00000010 | 00000100 | 00001000 | 00010000 | 00100000 | 01000000 | 10000000 |
上訴例子里的值也可以這么轉(zhuǎn)換下來:
" FOREGROUND_INTENSITY|FOREGROUND_BLUE "--->" 0x0008|0x0001 "--->" 00001000|00000001 "
--->"00001001"
然后根據(jù)"00001001"查看,哦,開啟第一位和第四位的屬性,那么也就是打開啟 藍色字體和高亮字體的屬性。
還有就是 這里的紅綠藍其實就是三原色,經(jīng)過通過 紅綠 紅藍 綠藍 還可得到 黃色 青色 粉色 這三種顏色。
//宏定義字體顏色 #define FOREGROUND_WHITE 0x0007 //白色(紅+綠+藍) 默認顏色 #define FOREGROUND_YELLOW 0x0006 //黃色(紅+綠) #define FOREGROUND_PINK 0x0005 //粉色(紅+藍) #define FOREGROUND_INDIGO 0x0003 //青色(綠+藍)
這里我把混合的顏色寫上來,為了方便使用,可以在自己的代碼里添加這個宏定義方便使用
到此這篇關(guān)于C/C++ 中怎樣使用SetConsoleTextAttribute()函數(shù)來控制輸出字符的顏色的文章就介紹到這了,更多相關(guān)C/C++控制輸出字符的顏色內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VC創(chuàng)建圓角dialog的實現(xiàn)方法
這篇文章主要介紹了VC創(chuàng)建圓角dialog的實現(xiàn)方法,結(jié)合實例形式分析了圓角dialog對話框的創(chuàng)建步驟與相關(guān)操作技巧,需要的朋友可以參考下2016-08-08
C語言全面細致講解單雙精度float與double的使用方法
C語言中小數(shù)的數(shù)據(jù)類型為 float 或 double:float 稱為單精度浮點數(shù),double 稱為雙精度浮點數(shù)。不像整數(shù),小數(shù)的長度始終是固定的,float 占用4個字節(jié),double 占用8個字節(jié)2022-05-05
《C++ Primer》隱式類類型轉(zhuǎn)換學(xué)習(xí)整理
在本篇文章里小編給大家整理的是關(guān)于《C++ Primer》隱式類類型轉(zhuǎn)換學(xué)習(xí)筆記內(nèi)容,需要的朋友們參考下。2020-02-02
C++設(shè)計模式中控制反轉(zhuǎn)與依賴注入淺析
這篇文章主要介紹了C++設(shè)計模式中控制反轉(zhuǎn)與依賴注入,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01

