zoukankan      html  css  js  c++  java
  • 给Win32 GUI程序增加控制台窗口的方法

    给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 年 "), 2008); 
        WriteConsole( GetStdHandle(STD_OUTPUT_HANDLE), str, _tcslen(str), &numOfCharWritten, NULL);

    使用C库函数则更简单,但上面一定要调用freopen才有效:

       int tmp = 0; 
    _tscanf_s(_T("%d "), &tmp); 
    _tprintf_s(_T("刚才输入的是 %d "), tmp);

    比如在响应WM_PAINT消息时,加入_tprintf_s(_T("重绘 %d 次 "), ++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();

     
  • 相关阅读:
    Python NLPIR(中科院汉语分词系统)的使用 十五分钟快速入门与完全掌握
    Python NLPIR(中科院汉语分词系统)的使用 十五分钟快速入门与完全掌握
    源码:我的关于NLP的博客(持续更新中...)
    源码:我的关于NLP的博客(持续更新中...)
    orm功能封装
    元类
    事件,存储
    索引
    mysql课外积累
    day35作业
  • 原文地址:https://www.cnblogs.com/S-volcano/p/5029303.html
Copyright © 2011-2022 走看看