【问题标题】:C++ Colour Console TextC++ 颜色控制台文本
【发布时间】:2014-01-03 16:11:44
【问题描述】:

我一直在四处寻找,无法相信找到有多难。 我有以下代码:

cout << "Hello";
cout << "Bye";

我希望第一行是green,第二行是red。 我设法找到:

system(" color 2");

但是,这会使控制台中的所有文本变成绿色

我只需要它在 Windows 7 上工作

【问题讨论】:

  • 我不认为有一种便携的方式可以做到这一点。例如,Bash 使用颜色代码(参见tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html)。其他 shell,尤其是在其他操作系统上,会以不同的方式执行此操作。
  • 在 Linux 上您可以使用 Ansi 颜色代码。看看[这个答案][1]。 [1]:stackoverflow.com/questions/2353430/…
  • 在 DOS 下,如果将 device=C:\DOS\ANSI.SYS 添加到 config.sys,也可以使用 ANSI 颜色。当然,我更喜欢 devicehigh 来使用所有这些备用 UMB。
  • 我只需要它与 Windows 7 一起工作

标签: c++


【解决方案1】:

不幸的是。没有本地可移植的方式来执行此操作,因为 bash/linux 将使用 ANSI 转义码(就像旧 DOS 一样),但 Windows XP 或更高版本将使用控制台 API(textcolor 等)调用。

您可能会获得一个第三方库,它可以为两者提供一个 API(ncurses/p-curses)。

看看here

【讨论】:

    【解决方案2】:

    如果您使用的是 windows,您可以使用 SetConsoleTextAttribute 将文本着色为任何颜色:

    void change_color(const int color_flags)
    {
        HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute( hConsole, color_flags );
    }
    template <class T>
    void print_colored(const int color_flags,const T & arg)
    {
        change_color(color_flags);
        cout << arg;
        change_color(FOREGROUND_RED   | FOREGROUND_GREEN | FOREGROUND_BLUE);//back to normal
    }
    
    print_colored(FOREGROUND_RED,"stuff");//this will be red
    

    您可以找到有关着色标志here的更多信息

    【讨论】:

      【解决方案3】:

      对我有用的方法是使用ANSI escape codes,但我没有使用 Windows(不过它可能仍然有效):

      #include <iostream>
      
      int main()
      {
          std::cout << "\x1b[32;1mHello\x1b[0m\n";
          std::cout << "\x1b[31;1mBye\x1b[0m\n";
      }
      

      【讨论】:

        【解决方案4】:

        在支持 ANSI 的终端上的 c++ 中,可以编写自己的 ansi 流操纵器,如 std::endl,但在使用时以更易读的方式处理 ansi 转义代码。

        对于基本的原始实现,这样做的代码可能如下所示:

        namespace ansi {
          template < class CharT, class Traits >
          constexpr
          std::basic_ostream< CharT, Traits > & reset( std::basic_ostream< CharT, Traits > &os )
          {
             return os << "\033[0m";
          }
        
          template < class CharT, class Traits >
          constexpr
          std::basic_ostream< CharT, Traits > & foreground_black( std::basic_ostream< CharT, Traits > &os )
          {
             return os << "\033[30m";
          }
        
          template < class CharT, class Traits >
          constexpr
          std::basic_ostream< CharT, Traits > & foreground_red( std::basic_ostream< CharT, Traits > &os )
          {
             return os << "\033[31m";
          }
          ...
         } // ansi
        

        它可以用在这样的代码中:

        std::cout << ansi::foreground_red << "in red" << ansi::reset << std::endl;
        

        【讨论】:

          【解决方案5】:

          这里有一个适用于 Windows 和 Linux 的解决方案:

          #include <string>
          #include <iostream>
          
          #ifdef _WIN32
          #define WIN32_LEAN_AND_MEAN
          #define VC_EXTRALEAN
          #include <Windows.h>
          #endif // _WIN32
          
          using namespace std;
          
          #define color_black      0
          #define color_dark_blue  1
          #define color_dark_green 2
          #define color_light_blue 3
          #define color_dark_red   4
          #define color_magenta    5
          #define color_orange     6
          #define color_light_gray 7
          #define color_gray       8
          #define color_blue       9
          #define color_green     10
          #define color_cyan      11
          #define color_red       12
          #define color_pink      13
          #define color_yellow    14
          #define color_white     15
          
          void print(const string s="") {
              cout << s << endl;
          }
          void print(const string s, const int textcolor, const int backgroundcolor) {
          #if defined(_WIN32)
              CONSOLE_SCREEN_BUFFER_INFO csbi;
              WORD default_colors = 0;
              if(GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)) default_colors = csbi.wAttributes;
              SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), backgroundcolor<<4|textcolor);
          #elif defined(__linux__)
              string t, b;
              switch(textcolor) {
                  case  0: t="30"; break; // color_black      0
                  case  1: t="34"; break; // color_dark_blue  1
                  case  2: t="32"; break; // color_dark_green 2
                  case  3: t="36"; break; // color_light_blue 3
                  case  4: t="31"; break; // color_dark_red   4
                  case  5: t="35"; break; // color_magenta    5
                  case  6: t="33"; break; // color_orange     6
                  case  7: t="37"; break; // color_light_gray 7
                  case  8: t="90"; break; // color_gray       8
                  case  9: t="94"; break; // color_blue       9
                  case 10: t="92"; break; // color_green     10
                  case 11: t="96"; break; // color_cyan      11
                  case 12: t="91"; break; // color_red       12
                  case 13: t="95"; break; // color_pink      13
                  case 14: t="93"; break; // color_yellow    14
                  case 15: t="97"; break; // color_white     15
                  default: t="97";
              }
              switch(backgroundcolor) {
                  case  0: b= "40"; break; // color_black      0
                  case  1: b= "44"; break; // color_dark_blue  1
                  case  2: b= "42"; break; // color_dark_green 2
                  case  3: b= "46"; break; // color_light_blue 3
                  case  4: b= "41"; break; // color_dark_red   4
                  case  5: b= "45"; break; // color_magenta    5
                  case  6: b= "43"; break; // color_orange     6
                  case  7: b= "47"; break; // color_light_gray 7
                  case  8: b="100"; break; // color_gray       8
                  case  9: b="104"; break; // color_blue       9
                  case 10: b="102"; break; // color_green     10
                  case 11: b="106"; break; // color_cyan      11
                  case 12: b="101"; break; // color_red       12
                  case 13: b="105"; break; // color_pink      13
                  case 14: b="103"; break; // color_yellow    14
                  case 15: b="107"; break; // color_white     15
                  default: b= "40";
              }
              cout << "\033["+t+";"+b+"m";
          #endif // Windows/Linux
              cout << s;
          #if defined(_WIN32)
              SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), default_colors);
          #elif defined(__linux__)
              cout << "\033[0m"; // reset color
          #endif // Windows/Linux
          }
          void wait() {
              cin.get();
          }
          
          void print_color_test() {
              print(" ", color_black, color_magenta   );
              print(" ", color_black, color_blue      );
              print(" ", color_black, color_light_blue);
              print(" ", color_black, color_cyan      );
              print(" ", color_black, color_green     );
              print(" ", color_black, color_yellow    );
              print(" ", color_black, color_orange    );
              print(" ", color_black, color_red       );
              print();
              print(" ", color_black, color_black     );
              print(" ", color_black, color_gray      );
              print(" ", color_black, color_light_gray);
              print(" ", color_black, color_white     );
              print(" ", color_black, color_pink      );
              print(" ", color_black, color_dark_blue );
              print(" ", color_black, color_dark_green);
              print(" ", color_black, color_dark_red  );
              print();
              print("#", color_magenta   , color_black);
              print("#", color_blue      , color_black);
              print("#", color_light_blue, color_black);
              print("#", color_cyan      , color_black);
              print("#", color_green     , color_black);
              print("#", color_yellow    , color_black);
              print("#", color_orange    , color_black);
              print("#", color_red       , color_black);
              print();
              print("#", color_black     , color_black);
              print("#", color_gray      , color_black);
              print("#", color_light_gray, color_black);
              print("#", color_white     , color_black);
              print("#", color_pink      , color_black);
              print("#", color_dark_blue , color_black);
              print("#", color_dark_green, color_black);
              print("#", color_dark_red  , color_black);
              print();
          }
          
          int main() {
              print("test");
              print_color_test();
              print("test\n");
          
              print("Hello", color_green, color_black);
              print("Bye", color_red, color_black);
          
              wait();
              return 0;
          }
          

          【讨论】:

            猜你喜欢
            • 2012-03-19
            • 1970-01-01
            • 2020-10-06
            • 2013-06-12
            • 2016-03-04
            • 2013-06-25
            • 2022-01-16
            • 2020-02-10
            • 2011-03-17
            相关资源
            最近更新 更多