C++ Demo 002 : 让 STL 中的 cout 输出彩色的文字

缘起:

这是一个从CodeProject上看到的小程序,很有意思。原文里面没有任何对代码的解释和说明,这里摘过来,做个笔记。

程序的原作者 :Vincent Godin

题目:

写一个程序,让 STL 中的 cout 输出彩色的文字到显示器上。

环境:

Windows XP Professional sp3 下面用 GNU GCC 的编译器编译,它支持标准C++。推荐使用!^_^

实验步骤:

1,新建一个文本文件,命名 "console_color.h" 。

2,粘贴一下代码到此 .h 文件中。
C++ Demo 002 : 让 STL 中的 cout 输出彩色的文字C++ Demo 002 : 让 STL 中的 cout 输出彩色的文字console_color.h

// ConsoleColor.h#ifndef _CONSOLE_COLOR_H_#define _CONSOLE_COLOR_H_#include <iostream>#include <windows.h>inline std::ostream& blue(std::ostream &s){    HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);    SetConsoleTextAttribute(hStdout, FOREGROUND_BLUE              |FOREGROUND_GREEN|FOREGROUND_INTENSITY);    return s;}inline std::ostream& red(std::ostream &s){    HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);    SetConsoleTextAttribute(hStdout,                FOREGROUND_RED|FOREGROUND_INTENSITY);    return s;}inline std::ostream& green(std::ostream &s){    HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);    SetConsoleTextAttribute(hStdout,              FOREGROUND_GREEN|FOREGROUND_INTENSITY);    return s;}inline std::ostream& yellow(std::ostream &s){    HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);    SetConsoleTextAttribute(hStdout,         FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_INTENSITY);    return s;}inline std::ostream& white(std::ostream &s){    HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);    SetConsoleTextAttribute(hStdout,       FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);    return s;}struct color {    color(WORD attribute):m_color(attribute){};    WORD m_color;};template <class _Elem, class _Traits>std::basic_ostream<_Elem,_Traits>&    operator<<(std::basic_ostream<_Elem,_Traits>& i, const color& c){    HANDLE hStdout=GetStdHandle(STD_OUTPUT_HANDLE);    SetConsoleTextAttribute(hStdout,c.m_color);    return i;}#endif// Copyleft Vincent Godin

3,另外,新建一个文本文件,命名"console_color_test.cpp"

4,粘贴一下代码到此 .cpp 文件中。
C++ Demo 002 : 让 STL 中的 cout 输出彩色的文字C++ Demo 002 : 让 STL 中的 cout 输出彩色的文字console_color_test.cpp

#include "console_color.h"int main(){    std::cout << green << "绿色的文本哦。" << red << "这个是红的吧!"              << white << std::endl;    std::cout << color(FOREGROUND_RED|FOREGROUND_GREEN)              << "This text has a really exiting color ! -- edited by Vincent"              << white << std::endl;    return 0;}

5,利用 GCC 编译这个文件。

g++ console_color_test.cpp -o main

6,在控制台输入 main 运行程序,看看效果吧。有点意思。

C++ Demo 002 : 让 STL 中的 cout 输出彩色的文字

讨论:
C++ Demo 002 : 让 STL 中的 cout 输出彩色的文字

//核心代码段,举一个函数说一下,其他的函数都是换了参数而已。inline std::ostream& blue(std::ostream &s){    HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);    SetConsoleTextAttribute(hStdout, FOREGROUND_BLUE              |FOREGROUND_GREEN|FOREGROUND_INTENSITY);    return s;}

整个函数就是定义了一个用于输出流的控制符,看过std::endl的定义吗,呵呵,就是模仿它了。

这里面用到了两个函数,GetStdHandleSetConsoleTextAttribute

HANDLE GetStdHandle( DWORD nStdHandle);

这个函数用来获取标准输入、输出以及标准错误设备的句柄。

BOOL SetConsoleTextAttribute( HANDLE hConsoleOutput, WORD wAttributes);

用来设置控制台文本的属性,更多的内容查看 MSDN 吧。我也懒得翻译了,都非常容易明白。

color结构体不说了,非常简单。

剩下来的,就是这个重载的 << 操作符。仔细看一下,Vincent 这哥们用了模板来实现,第一个参数是一个输出流的对象,第二个参数就是个 color 结构体,用来传入结构体中放入的颜色属性。^_^


template<class_Elem,class_Traits>

std::basic_ostream<_Elem,_Traits>&    operator<<(std::basic_ostream<_Elem,_Traits>& i, const color& c){    HANDLE hStdout=GetStdHandle(STD_OUTPUT_HANDLE);    SetConsoleTextAttribute(hStdout,c.m_color);    return i;}

总结:

本文是对 Win32 API 关于 Console 这一块的一个小应用,还是有点意思的。至少,把这个封装成 lib 后,你可以让你的 Console 变得更可爱一点。不再是默认的黑白配了。-_-!

参考资料:

[1] MSDN Console Functions (Windows) : http://msdn.microsoft.com/en-us/library/ms682073%28v=VS.85%29.aspx

[2] CodeProject Command line processing (Add color to your std::cout) : http://www.codeproject.com/KB/cpp/cout_color.aspx
原文链接: https://www.cnblogs.com/PerfectString/archive/2010/09/16/console_color.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/15065

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午2:53
下一篇 2023年2月7日 下午2:56

相关推荐