给Win32 GUI程序增加控制台窗口的方法

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();

来源: <http://www.cnblogs.com/BeginGame/archive/2011/09/19/2181878.html>

转载于:https://www.cnblogs.com/S-volcano/p/5029303.html

给Win32 GUI程序增加控制台窗口的方法相关推荐

  1. 让Win32窗口程序拥有控制台窗口

    让Win32窗口程序拥有控制台窗口 首先,为什么我们有了普通窗口后还要控制台窗口呢?因为我们可以用它方便的输出调试信息,而且普通玩家看到了也会觉得很高端.如果他会输几条命令,可能他会以为自己就是黑客了 ...

  2. 【OpenGL】二十四、OpenGL 纹理贴图 ( 读取文件内容 | 桌面程序添加控制台窗口 | ‘fopen‘: This function may be unsafe 错误处理 )

    文章目录 一.文件读取 二.报错处理 ( 'fopen': This function or variable may be unsafe. ) 三.桌面程序添加控制台窗口 四.相关资源 一.文件读取 ...

  3. 在MFC程序中增加控制台窗口

    MFC程序中,如果想要输出调试信息,我们一般都是TRACE或者使用LOG文件,都不是很方便,第一个需要我们在调试状态下,第二个也要配置麻烦而且不直观.而使用Console来显示调试信息应该是更好的选择 ...

  4. 用 PHP-GTK2 做 Win32 GUI 程序

    PHP通常是做为服务器端脚本执行,如果告诉你PHP可以编写普通的GUI程序,你应该很感兴趣.下面介绍的PHP-GTK就是PHP的GUI扩展.GTK是一个业界标准的图形库,具有良好的移植性.如果你用过l ...

  5. 让Dev-C++运行C++程序的控制台窗口等待查看运行结果

    2019独角兽企业重金招聘Python工程师标准>>> 在使用Dev-C++运行C++程序时,控制台窗口总是一晃而过,无法看到输出结果,着实让人苦恼,解决这个问题 可以用以下方法: ...

  6. 向MFC应用程序添加控制台窗口

    简介 如果你曾经写过MFC应用程序,也许你忽略了控制台窗口.熟悉了控制台窗口的人会认为它是如此的便捷,我就是一个,认为printf或者cout是最优秀的调试函数,可以在不打开任务管理器的情况下在控制台 ...

  7. C# 控制台程序 隐藏控制台窗口

    在某些项目中,需要采用控制台程序,但是又不需要通过dos窗口进行交互,同时打算隐藏掉难看的控制台窗口.实现的方法很多,有的是修改链接命令.我采用的方法略有些麻烦,首先是给窗口命名,之后找到该窗口指针, ...

  8. WPF关闭应用程序,释放Window窗口资源方法

    WindowsForm里一个Application.Exit();方法就可以关闭应用程序,释放掉资源. WPF里Application类没有该方法,但是有一个Exit的事件驱动,在WPF应用程序里面关 ...

  9. VS创建 Win32 应用程序(实现窗口的创建)

    VS创建 Win32 应用程序(实现窗口的创建)(二) 程序框架如下: 一.VS演示流程 打开VS----文件----新建----项目----Windows 桌面应用程序 二.生成代码:(大部分函数在 ...

最新文章

  1. 定时器0工作方式2,定时1s
  2. Android ViewPager
  3. Python学习之路20-数据模型
  4. Css3 display用法
  5. linux机器不能上网,Deepin Linux 无法上网
  6. .condarc(conda 配置文件)、换国内源
  7. centos7安装zabbix时的一些注意事项
  8. android自定义ViewPager之——处理与ScrollView的事件冲突
  9. java滥用接口_接口滥用问题
  10. 老男孩Linux课程职场高薪秘籍
  11. GPS信号防丢失、干扰和欺骗——基于雷达的解决方案
  12. matlab 汽车雷达模拟器,雷达回波模拟器在汽车雷达测试中的应用
  13. 142. 环形链表 II 双指针法
  14. 运筹系列63:使用ALNS求解大规模TSP问题
  15. 电子邮箱地址如何注册?个人电子邮箱地址大全
  16. git rebase 理解
  17. html请求资源不可用,HTTP状态404 – 请求的资源(/)不可用
  18. 【Mac使用技巧】Mac的VMware虚拟机系统时间如何调成不同步
  19. VBA 根据股票代码查询价格
  20. iOS中延时执行(睡眠)的几种方法

热门文章

  1. Going Further with Point Pair Features: PPF, 如何走的更远?
  2. 【C++】局部变量、全局变量、静态变量与动态对象的性质
  3. 机器学习中回归问题的性能衡量指标
  4. OpenCV--实现图像滑动窗口截取子图操作
  5. 【图像配准】基于灰度的模板匹配算法(一):MAD、SAD、SSD、MSD、NCC、SSDA、SATD算法
  6. 你应该要掌握的7种回归分析方法
  7. OpenCV阈值处理函数cv::threshold()
  8. android studio抛出,Android Studio中新的项目不能运行,抛出错误(Android Studio new pr
  9. kafka 丢弃数据_Kafka史上最详细原理总结下
  10. python 参数_python脚本命令行参数解析