C++ 更改控制台顯示文本顏色


 

兩種方法

一種方法


獲得控制台輸入輸出句柄

  • 函數原型: HANDLE GetStdHandle(DWORD nStdHandle);
  • 參數:
    • nStdHandle定義函數返回的是標准輸入或標准輸出或標准錯誤的句柄.取值為一下
      • STD_INPUT_HANDLE 標准輸入
      • STD_OUTPUT_HANDLE 標准輸出
      • STD_ERROR_HANDLE 標准錯誤
  • 返回值:
    • 如果函數成功,這個返回值為設備資源句柄
    • 如果函數是吧,返回值是INVALID_HANDLE_VALUE標准,如果想要知道錯誤信息,調用GetLastError函數去獲得
  • 頭文件: window.h
  • 說明: 返回一個標准輸入或輸出或錯誤的句柄

設置控制台輸入輸出文本前景色背景色

  • 函數原型: BOOL SetConsoleTextAttribute(HANDLE hConsoleOutput,WORD wAttributes );
  • 參數:
    • hConsoleOutput 控制台的資源句柄, 該句柄必須具有GENERIC_READ訪問權限
    • wAttributes設置文本前景色和背景色的具體值,取值如下,可以使一個或 者組合
      • FOREGROUND_BLUE 前景色為藍
      • FOREGROUND_GREEN 前景色為綠
      • FOREGROUND_RED 前景色為紅
      • FOREGROUND_INTENSITY 前景色為強光
      • BACKGROUND_BLUE 背景色為藍
      • BACKGROUND_GREEN 背景色為綠
      • BACKGROUND_RED 背景色為紅
      • BACKGROUND_INTENSITY 背景色為強光
  • 頭文件: window.h
  • 說明: 用於設置文本前景色和背景色,只對在其后的文本輸出或輸入

使用步驟
聲明一個 HANDLE句柄並獲得標准輸出句柄用GetStdHandle(STD_OUTPUT_HANDLE)

調用SetConsoleTestAttribute函數設置文本前景色和背景色

例子:

實現一個在 dos 界面上的色彩菜單:

View Code
  1 #include<iostream>  
  2 #include<string>    
  3 #include<conio.h>      
  4 #include<windows.h>
  5 //頭文件定義
  6 
  7 
  8 #define whiteFont FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_INTENSITY  //對標志位進行組合設置成白字紅底
  9 #define whiteFont_redBck  BACKGROUND_RED|FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN|BACKGROUND_INTENSITY|FOREGROUND_INTENSITY  //對標志位進行組合設置成紅字白底
 10 
 11 using namespace std;
 12 
 13 class ColorTextChoose
 14 //實現類
 15 {
 16 private:
 17     string str[4],str_One[4],str_Two[4],str_Three[4],str_Four[4],*str_index[4];
 18     //str 為主菜單
 19     //str_One 子菜單項第一行
 20     //str_Two 子菜單項第二行
 21     //str_Three 子菜單項第三行
 22     //str_Four 子菜單項第四行
 23     //str_index 用於索引 str_One,str_Two,str_Three,str_Four
 24     int index,subIndex;
 25     //標記當前選擇的子菜單項,subIndex 為 -1 時候沒有選中子菜單
 26     bool choose;
 27     //標記是否選擇了子菜單項
 28 public:
 29     ColorTextChoose()  //構造函數初始化數據
 30     {
 31         str[0] = "text one   ";
 32         str[1] = "test two   ";
 33         str[2] = "test three ";
 34         str[3] = "test four  ";
 35 
 36         str_index[0] = str_One;
 37         str_index[1] = str_Two;
 38         str_index[2] = str_Three;
 39         str_index[3] = str_Four;
 40 
 41         str_One[0] = "One_1 ";
 42 
 43         str_Two[0] = "Two_1 ";
 44         str_Two[1] = "Two_2 ";
 45 
 46         str_Three[0] = "Three_1 ";
 47         str_Three[1] = "Three_2 ";
 48         str_Three[2] = "Three_3 ";
 49 
 50         str_Four[0] = "Four_1 ";
 51         str_Four[1] = "Four_2 ";
 52         str_Four[2] = "Four_3 ";
 53         str_Four[3] = "Four_4 ";
 54 
 55         index = 0;
 56         subIndex = -1;
 57         choose = false;
 58     }
 59     bool TextGoing()
 60     {
 61         this->showText();
 62         while(true)
 63         {
 64             char buffer = getch();
 65             switch(buffer)
 66             {
 67                 
 68             case 'w':
 69                 if(subIndex == 0)
 70                 {
 71                     subIndex = -1;
 72                     choose = false;
 73                     this->showText();
 74                 }
 75                 else
 76                 {
 77                     subIndex --;
 78                     this->showText();
 79                 }
 80                 break;//按w向上
 81             case 's':
 82                 if(subIndex >= index)
 83                 {   
 84                     this->showText();
 85                 }
 86                 else
 87                 {
 88                     choose = true;
 89                     subIndex++;
 90                     this->showText();
 91                 }
 92                 break;//按s向下
 93             case 'a':
 94                 if(index>0)
 95                 {
 96                     choose = false;
 97                     subIndex = -1;
 98                     index--;
 99                     this->showText();
100                 }    
101                 break;//向左
102             case 'd':
103                 if(index<3)
104                 {
105                     choose = false;
106                     subIndex = -1;
107                     index++;
108                     this->showText();
109                 }
110                 break;//向右
111             case 'q':
112                 ;
113             case 27:
114                 return true;//ESC
115             default:
116                 cout<<"\b";//退格
117             }
118         }
119     }
120     void showText()
121     {
122         system("color 07");//還原原系統的字體顏色和背景色
123         system("cls");      //清空控制台
124         cout<<"按 a/f 選擇菜單  按   w/s 選擇子菜單(Esc退出)"<<endl<<endl;
125         for(int i=0;i < 4; i++)
126         {
127             if( i != index || choose)
128             {
129                 //沒選子項沒選中和選擇下拉框的情況
130                 HANDLE outPutHandle = GetStdHandle(STD_OUTPUT_HANDLE);//獲得控制台設備描述表的句柄
131                 SetConsoleTextAttribute(outPutHandle,whiteFont);//設置白字黑背景
132             }
133             else
134             {
135                 //沒選子項的情況選中當前項的情況
136                 HANDLE outPutHandle = GetStdHandle(STD_OUTPUT_HANDLE);//獲得控制台設備描述表的句柄
137                 SetConsoleTextAttribute(outPutHandle,whiteFont_redBck);//設置文本背景設為紅色,前景色為白色
138             }
139             cout<<str[i];//輸出主字符穿菜單選項
140         }//顯示主菜單
141         cout<<endl;
142         for(int i=0;i < index+1; i++)
143         {
144             HANDLE outPutHandle = GetStdHandle(STD_OUTPUT_HANDLE);//獲得控制台設備描述表的句柄
145             SetConsoleTextAttribute(outPutHandle,whiteFont);//設置白字黑背景
146             for(int j=index;0<j;j--)
147                 cout<<"           ";//對齊用
148             if( i != subIndex )
149             {
150                 HANDLE outPutHandle = GetStdHandle(STD_OUTPUT_HANDLE);//獲得控制台設備描述表的句柄
151                 SetConsoleTextAttribute(outPutHandle,whiteFont);//設置白字黑背景
152             }
153             else
154             {
155                 HANDLE outPutHandle = GetStdHandle(STD_OUTPUT_HANDLE);//獲得控制台設備描述表的句柄
156                 SetConsoleTextAttribute(outPutHandle,whiteFont_redBck);//設置文本背景設為紅色,前景色為白色
157             }
158             cout<<(str_index[index])[i]<<endl;//輸出子字符穿菜單選項
159         }
160         //顯示次菜單
161         HANDLE outPutHandle = GetStdHandle(STD_OUTPUT_HANDLE);//獲得控制台設備描述表的句柄
162         SetConsoleTextAttribute(outPutHandle,whiteFont);//設置白字黑背景
163         //還原原來字體顏色
164     }
165 };
166 
167 
168 int main()
169 //主函數
170 {
171     ColorTextChoose one;
172     one.TextGoing();
173 
174     system("pause");
175     return 0;
176 }

輸出結果:

另一種方法


設置控制台輸入輸出前景色背景色

  • 函數原型:
    • int system( const char *command );
    • int _wsystem( const wchar_t *command );
  • 參數:
    • command為"color xy"color為關鍵字,x為背景色,y為前景色.x,y可以取值為
      • 0=黑色
      • 1=藍色
      • 2=綠色
      • 3=湖藍色
      • 4=紅色
      • 5=紫色
      • 6=黃色
      • 7=白色
      • 8=灰色
      • 9=淡藍色
      • A=淡綠色
      • B=淡淺綠色
      • C=淡紅色
      • D=淡紫色
      • E=淡黃色
      • F=亮白色
  • 頭文件:cstdlib

 例子:

使控制台背景為量白色,文本字體顏色為藍色:

 1 #include<iostream>  
 2 #include<cstdlib>    
 3 //頭文件定義
 4 using namespace std;
 5 
 6 int main()
 7 //主函數
 8 {
 9     system("color F1");
10     cout<<"change!"<<endl;
11     system("pause");
12     return 0;
13 }

輸出結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM