win32 桌面程序开启控制台进行调试,并为输出赋上颜色
【摘要】 打开控制台要打开控制台,需要先调用进程分配一个新的控制台。然后将标准输入输出重定向到文件流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)。)
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();
(略)
}
运行结果如下
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)