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