让Win32窗口程序拥有控制台窗口
来源:互联网 发布:无线传感器网络三要素 编辑:程序博客网 时间:2024/05/21 21:39
让Win32窗口程序拥有控制台窗口
首先,为什么我们有了普通窗口后还要控制台窗口呢?因为我们可以用它方便的输出调试信息,而且普通玩家看到了也会觉得很高端。如果他会输几条命令,可能他会以为自己就是黑客了。
示例效果:
WinMain作为入口函数后,手动创建了控制台窗口,然后创建了普通窗口,输出了一些信息到控制台窗口。
具体实现:
要创建一个控制台窗口,首先调用AllocConsole创建一个。但此时调用cout或者printf都不能正常输出文字到窗口(包括输入流cin和scanf)。所以需要如下重定向输入输出流:
AllocConsole();
FILE* stream;
freopen_s(&stream, "CON", "r", stdin);//重定向输入流
freopen_s(&stream, "CON", "w", stdout);//重定向输入流
如果我们需要用到控制台窗口句柄,可以调用FindWindow取得:
HWND _consoleHwnd;
SetConsoleTitle(DEFAULT_CONSOLE_TITLE);//设置窗口名
for (int i = 0; i < 100; i++)
{
_consoleHwnd = FindWindow(NULL, DEFAULT_CONSOLE_TITLE);
if (_consoleHwnd)
break;
Sleep(100);
}
然后还需要输出流句柄:
HANDLE _handleOutput;
_handleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
在不需要的时候请调用FreeConsole释放控制台窗口:
FreeConsole();
完成以上工作后,就能够创建一个控制台窗口,并能够使用cout标准输出流输出文字到其上。这里我们用wcout为例,并给文字添加上颜色:
void DebuggerConsole::Write(const String& str, int level)
{
switch(level)
{
case DebugLevel::BLANK://空白
SetConsoleTextAttribute(_handleOutput,
FOREGROUND_INTENSITY |
BACKGROUND_INTENSITY);
break;
case DebugLevel::TIME://时间(白色)
SetConsoleTextAttribute(_handleOutput,
BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_BLUE |
BACKGROUND_INTENSITY);
break;
case DebugLevel::INFO://信息(白色蓝底)
SetConsoleTextAttribute(_handleOutput,
FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE |
BACKGROUND_BLUE |
FOREGROUND_INTENSITY);
break;
case DebugLevel::NOTICE://提示(绿色)
SetConsoleTextAttribute(_handleOutput,
FOREGROUND_GREEN |
BACKGROUND_GREEN |
FOREGROUND_INTENSITY);
break;
case DebugLevel::WARN://警告(黄色)
SetConsoleTextAttribute(_handleOutput,
FOREGROUND_GREEN | FOREGROUND_RED |
BACKGROUND_GREEN | BACKGROUND_RED |
FOREGROUND_INTENSITY);
break;
case DebugLevel::ERR://错误(红色)
SetConsoleTextAttribute(_handleOutput,
FOREGROUND_RED |
BACKGROUND_RED |
FOREGROUND_INTENSITY);
break;
}
std::wcout << str.GetWcs();//获取字符串WCHAR数组版本
}
其中SetConsoleTextAttribute设置了输出文本的颜色,第一个参数是前面取得的输出句柄,第二个参数是宏的值组合。FOREGROUND前缀代表前景色,BACKGROUND代表背景色。RED、GREEN、BLUE是三原色分量,INTENSITY代表颜色加强(变得更亮)。
最后再提一句,wcout不能直接输出中文,需要提前调用一句(至于为什么我也不知道^_^):
locale::global((locale("")));
作者:略游
日期:17-07-31
QQ:1339484752
- 让Win32窗口程序拥有控制台窗口
- 让win32控制台程序后台运行不显示命令行窗口
- win32窗口程序转为控制台
- 让控制台程序无窗口
- 隐藏win32控制台程序的窗口
- 在win32的窗口程序中加入控制台console窗口
- Vs2008 win32控制台程序不弹出控制台窗口的方法
- win32下将控制台程序改为窗口程序
- 如何隐藏win32 控制台程序的console窗口
- 在Win32控制台程序中添加Windows窗口
- 给Win32 GUI程序增加控制台窗口的方法
- win32 窗口程序实现控制台信息跟踪 简单案例
- MFC,Win32程序向控制台(Console)窗口输出调试信息
- 控制台程序窗口隐藏
- 控制台程序生成窗口
- Win32 Asm 窗口程序
- Win32程序窗口过程
- Win32窗口程序实例
- 1108. Finding Average (20)
- Catch That Cow
- 获取文件夹下所有文件和文件夹(递归)
- C++的数组元素为什么不能是引用类型
- MAVEN_依赖管理
- 让Win32窗口程序拥有控制台窗口
- 一条 sql group by
- PL/SQL结构
- [USACO3.3.5]A Game
- getLocationInWindow()与getLocationOnScreen()
- NIOP2015Day2T1 跳石头解题报告
- 第七章 函数表达式(闭包重点)
- 通过ajax得到数据,显示http://localhost:8081/项目名/[object%20Object] 404 (Not Found) 错误。
- 根据交通信号灯颜色决定汽车停车、行驶和慢行(采用枚举的方式)