win32 桌面程序开启控制台进行调试,并为输出赋上颜色

举报
福州司马懿 发表于 2022/11/17 23:41:16 2022/11/17
【摘要】 打开控制台要打开控制台,需要先调用进程分配一个新的控制台。然后将标准输入输出重定向到文件流AllocConsole();FILE* stream;freopen_s(&stream, "CON", "r", stdin);//重定向输入流freopen_s(&stream, "CON", "w", stdout);//重定向输入流 设置控制台名称SetConsoleTitleA(CONSO...

打开控制台

要打开控制台,需要先调用进程分配一个新的控制台。然后将标准输入输出重定向到文件流。

一个进程只能与一个控制台相关联,因此,如果调用进程已有一个控制台,则 AllocConsole 函数会失败。 进程可使用 FreeConsole 函数从其当前控制台分离自身。

AllocConsole();
FIL.E* stream;
freopen_s(&stream, "CON", "r", stdin);//重定向输入流
freopen_s(&stream, "CON", "w", stdout);//重定向输入流

设置控制台名称

SetConsoleTitleA(CONSOLE_TITLE);

获取控制台窗口句柄

HWND consoleHwnd = FindWindowA(NULL, CONSOLE_TITLE);

HANDLE hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);

三基色(光学三元色)RGB

三基色是指通过其他颜色的混合无法得到的“基本色”由于人的肉眼有感知RGB三种不同颜色的锥体细胞,因此色彩空间通常可以由RGB三种基本色来表达。

一般指光的三基色R(Red)、G(Green)、B(Blue)。(颜料的红、绿、蓝称为三基色,其实真正科学的讲法三原色应该是品红(M)、黄(Y)、青(C)。)

图片.png

C++控制台支持如下几种颜色,其它颜色通过以下几种颜色或运算得到

  • FOREGROUND_BLUE 蓝色文字
  • FOREGROUND_GREEN 绿色文字
  • FOREGROUND_RED 红色文字
  • FOREGROUND_INTENSITY 表示设置前景色为高亮显示
  • BACKGROUND_BLUE 蓝色背景
  • BACKGROUND_GREEN 绿色背景
  • BACKGROUND_RED 红色背景
  • BACKGROUND_INTENSITY 表示设置背景色为高亮显示

为输出上色

首先要定义一个代表颜色的枚举类型

enum DebugLevel
{
    BLANK,
    DEBUG,
    INFO,
    WARN,
    ERR,
    FATAL,
};

然后定义写日志的函数

void WriteLog(const string& str, DebugLevel level)
{
    HANDLE hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    switch (level)
    {
    case DebugLevel::BLANK://灰底灰字(看不见字,即无字)
        SetConsoleTextAttribute(hConsoleOutput,
            FOREGROUND_INTENSITY |
            BACKGROUND_INTENSITY
        );
        break;
    case DebugLevel::DEBUG://绿底高亮字
        SetConsoleTextAttribute(hConsoleOutput,
            FOREGROUND_GREEN |
            FOREGROUND_INTENSITY |
            BACKGROUND_GREEN
        );
        break;
    case DebugLevel::INFO://蓝底白字
        SetConsoleTextAttribute(hConsoleOutput,
            FOREGROUND_GREEN | 
            FOREGROUND_RED | 
            FOREGROUND_BLUE |
            FOREGROUND_INTENSITY |
            BACKGROUND_BLUE
        );
        break;
    case DebugLevel::WARN://黄底高亮字
        SetConsoleTextAttribute(hConsoleOutput,
            FOREGROUND_GREEN | 
            FOREGROUND_RED |
            FOREGROUND_INTENSITY |
            BACKGROUND_GREEN | 
            BACKGROUND_RED
        );
        break;
    case DebugLevel::ERR://红底高亮字
        SetConsoleTextAttribute(hConsoleOutput,
            FOREGROUND_RED |
            FOREGROUND_INTENSITY |
            BACKGROUND_RED
        );
        break;
    case DebugLevel::FATAL://白底黑字
        SetConsoleTextAttribute(hConsoleOutput,
            BACKGROUND_GREEN | 
            BACKGROUND_RED | 
            BACKGROUND_BLUE |
            BACKGROUND_INTENSITY);
        break;
    }
    printf("%s\n", str.c_str()); //获取字符串WCHAR数组版本

    SetConsoleTextAttribute(hConsoleOutput, //还原回初始颜色(黑底白字)
        FOREGROUND_RED |
        FOREGROUND_GREEN |
        FOREGROUND_BLUE);
}

最后使用测试函数进行测试

void TestConsole()
{
    ShowConsole();
    string str = "hello world";
    WriteLog(str, BLANK);
    WriteLog(str, DEBUG);
    WriteLog(str, INFO);
    WriteLog(str, WARN);
    WriteLog(str, ERR);
    WriteLog(str, FATAL);
    printf("%s", str.c_str());
}

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: 在此处放置代码。
    TestConsole();
()
}

运行结果如下
图片.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。