给Win32 GUI程序增加控制台窗口的方法
2011-09-19 22:50
766 查看
2008年10月11日 星期六 下午 04:43
在Win32的GUI程序中,没有控制台窗口,我们输出调试信息时有些不方便,以往我的做法是使用MessageBox弹出对话框、OutputDebugString向VS的调试窗口输出信息等,但总感觉不如控制台输出几句printf有效率。经过尝试发现GUI程序照样能够拥有(且仅能够拥有一个)控制台窗口,具体做法如下:
#include <locale.h>
在程序初始化时,加入以下代码:
FILE* fpDebugOut = NULL;
FILE* fpDebugIn = NULL;
if( !AllocConsole() ) MessageBox(NULL, _T("控制台生成失败。"), NULL, 0);
SetConsoleTitle(_T("Debug Window"));
_tfreopen_s(&fpDebugOut, _T("CONOUT$"),_T("w"), stdout);
_tfreopen_s(&fpDebugIn, _T("CONIN$"), _T("r"), stdin);
_tsetlocale(LC_ALL, _T("chs")); //这是必要的,否则unicode模式下使用C库函数控制台输出不了中文 WriteConsole函数不受影响
注意AllocConsole可能失败,原因可能是程序已经于一个控制台窗口关联过了,等等。
程序结束时,加入以下代码:
fclose(fpDebugOut);
fclose(fpDebugIn);
FreeConsole();
好,现在已经加入了控制台,可以输出字符串了,使用标准的C库函数或者WriteConsole都可以:
使用WriteConsole的话前面其实不用调用freopen重定向输出流了,直接WriteConsole就行:
TCHAR str[256];
DWORD numOfCharWritten = 0;
_stprintf_s(str, 256, _T("今年是 %d 年\n"), 2008);
WriteConsole( GetStdHandle(STD_OUTPUT_HANDLE), str, _tcslen(str), &numOfCharWritten, NULL);
使用C库函数则更简单,但上面一定要调用freopen才有效:
int tmp = 0;
_tscanf_s(_T("%d\n"), &tmp);
_tprintf_s(_T("刚才输入的是 %d\n"), tmp);
比如在响应WM_PAINT消息时,加入_tprintf_s(_T("重绘 %d 次\n"), ++count),则每次窗口绘制的时候都将输出总重绘次数。
最后,定义两个宏图省事:
#define CREATE_DEBUG_CONSOLE \
FILE* fpDebugOut = NULL; \
FILE* fpDebugIn = NULL; \
FILE* fpDebugErr = NULL; \
if( !AllocConsole() ) \
MessageBox(NULL, _T("控制台生成失败。"), NULL, 0); \
SetConsoleTitle(_T("Debug Window")); \
_tfreopen_s(&fpDebugOut, _T("CONOUT$"),_T("w"), stdout); \
_tfreopen_s(&fpDebugIn, _T("CONIN$"), _T("r"), stdin); \
_tfreopen_s(&fpDebugErr, _T("CONOUT$"),_T("w"), stderr); \
_tsetlocale(LC_ALL, _T("chs"));
#define RELEASE_DEBUG_CONSOLE \
fclose(fpDebugOut); \
fclose(fpDebugIn); \
fclose(fpDebugErr); \
FreeConsole();
在Win32的GUI程序中,没有控制台窗口,我们输出调试信息时有些不方便,以往我的做法是使用MessageBox弹出对话框、OutputDebugString向VS的调试窗口输出信息等,但总感觉不如控制台输出几句printf有效率。经过尝试发现GUI程序照样能够拥有(且仅能够拥有一个)控制台窗口,具体做法如下:
#include <locale.h>
在程序初始化时,加入以下代码:
FILE* fpDebugOut = NULL;
FILE* fpDebugIn = NULL;
if( !AllocConsole() ) MessageBox(NULL, _T("控制台生成失败。"), NULL, 0);
SetConsoleTitle(_T("Debug Window"));
_tfreopen_s(&fpDebugOut, _T("CONOUT$"),_T("w"), stdout);
_tfreopen_s(&fpDebugIn, _T("CONIN$"), _T("r"), stdin);
_tsetlocale(LC_ALL, _T("chs")); //这是必要的,否则unicode模式下使用C库函数控制台输出不了中文 WriteConsole函数不受影响
注意AllocConsole可能失败,原因可能是程序已经于一个控制台窗口关联过了,等等。
程序结束时,加入以下代码:
fclose(fpDebugOut);
fclose(fpDebugIn);
FreeConsole();
好,现在已经加入了控制台,可以输出字符串了,使用标准的C库函数或者WriteConsole都可以:
使用WriteConsole的话前面其实不用调用freopen重定向输出流了,直接WriteConsole就行:
TCHAR str[256];
DWORD numOfCharWritten = 0;
_stprintf_s(str, 256, _T("今年是 %d 年\n"), 2008);
WriteConsole( GetStdHandle(STD_OUTPUT_HANDLE), str, _tcslen(str), &numOfCharWritten, NULL);
使用C库函数则更简单,但上面一定要调用freopen才有效:
int tmp = 0;
_tscanf_s(_T("%d\n"), &tmp);
_tprintf_s(_T("刚才输入的是 %d\n"), tmp);
比如在响应WM_PAINT消息时,加入_tprintf_s(_T("重绘 %d 次\n"), ++count),则每次窗口绘制的时候都将输出总重绘次数。
最后,定义两个宏图省事:
#define CREATE_DEBUG_CONSOLE \
FILE* fpDebugOut = NULL; \
FILE* fpDebugIn = NULL; \
FILE* fpDebugErr = NULL; \
if( !AllocConsole() ) \
MessageBox(NULL, _T("控制台生成失败。"), NULL, 0); \
SetConsoleTitle(_T("Debug Window")); \
_tfreopen_s(&fpDebugOut, _T("CONOUT$"),_T("w"), stdout); \
_tfreopen_s(&fpDebugIn, _T("CONIN$"), _T("r"), stdin); \
_tfreopen_s(&fpDebugErr, _T("CONOUT$"),_T("w"), stderr); \
_tsetlocale(LC_ALL, _T("chs"));
#define RELEASE_DEBUG_CONSOLE \
fclose(fpDebugOut); \
fclose(fpDebugIn); \
fclose(fpDebugErr); \
FreeConsole();
相关文章推荐
- 给Win32 GUI程序增加控制台窗口的方法
- GUI程序如何使用控制台输出调试信息[zz][MFC调用win32窗口显示调试信息,使用AllocConsole 函数 ]
- Vs2008 win32控制台程序不弹出控制台窗口的方法
- 用什么方法调用控制台程序,同时做到:1.隐藏控制台窗口;2.获取控制台程序的exit status
- python win32api win32gui win32con 窗口句柄 发送消息 常用方法 键盘输入
- 妙用Delphi编译器开关为程序增加便捷的控制台调试/日志窗口
- win8.1 64位qt5.4.0 gui程序调用控制台窗口
- 在MFC,Win32程序中向控制台(Console)窗口输出调试信息
- Visual Studio控制台程序输出窗口一闪而过的解决方法
- VC++ 控制台程序不弹出窗口的方法
- Visual Studio控制台程序输出窗口一闪而过的解决方法
- VC++2005运行Win32控制台程序时,为什么弹不出控制台窗口(无法看到运行结果)?
- VC++/VS2010 Win32控制台程序 运行结束 DOS/dos窗口立刻消失/一闪而过 的解决方法整理
- Visual Studio控制台程序输出窗口一闪而过的解决方法
- 妙用Delphi编译器开关为程序增加便捷的控制台调试/日志窗口
- vs2010 C++ win32控制台程序窗口闪退问题解决办法汇总
- 在GUI程序中使用控制台的两种方法
- win32 窗口程序实现控制台信息跟踪 简单案例
- Visual Studio控制台程序输出窗口一闪而过的解决方法
- MFC(win32GUI)程序中显示Dos调试信息.console.显示控制台界面.标准输出.