【问题标题】:Print Coloured Text to Console in C++在 C++ 中将彩色文本打印到控制台
【发布时间】:2010-10-28 07:30:47
【问题描述】:

我想写一个控制台类,可以将彩色文本输出到控制台。

所以我可以做类似的事情(基本上是 printf 的包装器):

Console::Print( "This is a non-coloured message\n" );
Console::Warning( "This is a YELLOW warning message\n" );
Console::Error( "This is a RED error message\n" );

如何将不同颜色的文本打印到 Windows 控制台?

【问题讨论】:

    标签: c++ programming-languages text console terminal


    【解决方案1】:

    查看this guide。我会制作一个自定义操纵器,这样我就可以执行以下操作:

    std::cout << "standard text" << setcolour(red) << "red text" << std::endl;
    

    Here 是关于如何实现自己的操纵器的小指南。

    快速代码示例:

    #include <iostream>
    #include <windows.h>
    #include <iomanip>
    
    using namespace std;
    
    enum colour { DARKBLUE = 1, DARKGREEN, DARKTEAL, DARKRED, DARKPINK, DARKYELLOW, GRAY, DARKGRAY, BLUE, GREEN, TEAL, RED, PINK, YELLOW, WHITE };
    
    struct setcolour
    {
       colour _c;
       HANDLE _console_handle;
    
    
           setcolour(colour c, HANDLE console_handle)
               : _c(c), _console_handle(0)
           { 
               _console_handle = console_handle;
           }
    };
    
    // We could use a template here, making it more generic. Wide streams won't
    // work with this version.
    basic_ostream<char> &operator<<(basic_ostream<char> &s, const setcolour &ref)
    {
        SetConsoleTextAttribute(ref._console_handle, ref._c);
        return s;
    }
    
    int main(int argc, char *argv[])
    {
        HANDLE chandle = GetStdHandle(STD_OUTPUT_HANDLE);
        cout << "standard text" << setcolour(RED, chandle) << " red text" << endl;
    
        cin.get();
    }
    

    【讨论】:

    • 此代码实际上不起作用,您刚刚替换的先前版本却起作用了。我会仔细检查我是否正确
    • @Brock Woolf:是的,抱歉。我在复制 HANDLE 时遇到问题。
    • 如果您想在中线更改颜色,请确保在再次调用 setcolour() 之前发送std::flush
    【解决方案2】:

    我搜索了“c++ 控制台编写彩色文本”,并在大约 4 或 5 点时找到了 this page。由于该网站有一个复制和粘贴部分,我想我会在这里发布(链接上的另一个问题rot 也提示了这个):

    #include <stdlib.h>
    #include <windows.h>
    #include <iostream>
    
    using namespace std;
    
    enum Color { DBLUE=1,GREEN,GREY,DRED,DPURP,BROWN,LGREY,DGREY,BLUE,LIMEG,TEAL,
        RED,PURPLE,YELLOW,WHITE,B_B };
    /* These are the first 16 colors anyways. You test the other hundreds yourself.
       After 15 they are all combos of different color text/backgrounds. */
    
    bool quit;
    
    void col(unsigned short color)
    {
        HANDLE hcon = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(hcon,color);
    }
    
    istream &operator>> ( istream &in, Color &c )
    {
        int tint;
        cin >> tint;
        if (tint==-1) quit=true;
        c=(Color)tint;
    }
    
    int main()
    {
        do {
            col(7); // Defaults color for each round.
            cout << "Enter a color code, or -1 to quit... ";
            Color y;
            cin >> y; // Notice that >> is defined above for Color types.
            col(y); // Sets output color to y.
            if (!quit) cout << "Color: " << (int)y << endl;
        } while (!quit);
        return 0;
    }
    

    对于 C#,有 this page

    【讨论】:

    • 您拥有的第一个链接提供了丰富的信息,即使它是 C#。
    • 在这种情况下,搜索词是“c# console.write colour text”
    【解决方案3】:
    #include <windows.h>
    #include <iostream.h>
    using namespace std;
    
    int main()
    {
        HANDLE hOut;
    
        hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    
        SetConsoleTextAttribute(hOut,
                                BACKGROUND_RED);
        cout << "Red     " << flush;
        SetConsoleTextAttribute(hOut,
                                BACKGROUND_RED |
                                BACKGROUND_INTENSITY);
        cout << "Red     " << endl;
    
        SetConsoleTextAttribute(hOut,
                                BACKGROUND_GREEN);
        cout << "Green   " << flush;
        SetConsoleTextAttribute(hOut,
                                BACKGROUND_GREEN |
                                BACKGROUND_INTENSITY);
        cout << "Green   " << endl;
    
        SetConsoleTextAttribute(hOut,
                                BACKGROUND_BLUE);
        cout << "Blue    " << flush;
        SetConsoleTextAttribute(hOut,
                                BACKGROUND_BLUE |
                                BACKGROUND_INTENSITY);
        cout << "Blue    " << endl;
    
        SetConsoleTextAttribute(hOut,
                                BACKGROUND_RED | 
                                BACKGROUND_GREEN);
        cout << "Yellow  " << flush;
        SetConsoleTextAttribute(hOut,
                                BACKGROUND_RED | 
                                BACKGROUND_GREEN |
                                BACKGROUND_INTENSITY);
        cout << "Yellow  " << endl;
    
        SetConsoleTextAttribute(hOut,
                                BACKGROUND_GREEN | 
                                BACKGROUND_BLUE);
        cout << "Cyan    " << flush;
        SetConsoleTextAttribute(hOut,
                                BACKGROUND_GREEN | 
                                BACKGROUND_BLUE |
                                BACKGROUND_INTENSITY);
        cout << "Cyan    " << endl;
    
        SetConsoleTextAttribute(hOut,
                                BACKGROUND_BLUE | 
                                BACKGROUND_RED);
        cout << "Magenta " << flush;
        SetConsoleTextAttribute(hOut,
                                BACKGROUND_BLUE | 
                                BACKGROUND_RED |
                                BACKGROUND_INTENSITY);
        cout << "Magenta " << endl;
    
        SetConsoleTextAttribute(hOut,
                                BACKGROUND_RED | 
                                BACKGROUND_GREEN | 
                                BACKGROUND_BLUE);
        cout << "White   " << flush;
        SetConsoleTextAttribute(hOut,
                                BACKGROUND_RED | 
                                BACKGROUND_GREEN | 
                                BACKGROUND_BLUE |
                                BACKGROUND_INTENSITY);
        cout << "White   " << endl;
    
        return 0;
    }
    

    【讨论】:

      【解决方案4】:

      使用这些功能

      enum c_color{BLACK=30,RED=31,GREEN=32,YELLOW=33,BLUE=34,MAGENTA=35,CYAN=36,WHITE=37};
      enum c_decoration{NORMAL=0,BOLD=1,FAINT=2,ITALIC=3,UNDERLINE=4,RIVERCED=26,FRAMED=51};
      void pr(const string str,c_color color,c_decoration decoration=c_decoration::NORMAL){
        cout<<"\033["<<decoration<<";"<<color<<"m"<<str<<"\033[0m";
      }
      
      void prl(const string str,c_color color,c_decoration decoration=c_decoration::NORMAL){
         cout<<"\033["<<decoration<<";"<<color<<"m"<<str<<"\033[0m"<<endl;
      }
      

      【讨论】:

        猜你喜欢
        • 2018-01-27
        • 2015-01-31
        • 2011-04-11
        • 1970-01-01
        • 2011-01-22
        • 1970-01-01
        • 2010-09-22
        • 1970-01-01
        相关资源
        最近更新 更多