用console做调试输出窗口(方法一)

在使用VC++开发界面程序的时候,经常会遇到代码调试的问题,而有时我们有觉得单步调试又很麻烦懒得一步步走下去,于是我们开始怀念基于控制台方式的printf和cout输出信息的方式了。^_^ 下面给大家介绍一个类,可以让你实现这个功能。在需要调试的工程中添加头文件console.h,然后在使用printf和cout前添加代码:

    ConsoleWindow window;
    window.Open();

     当然如果你不是在全局变量区,就需要new出一个新的对象:

     ConsoleWindow*   window = new ConsoleWindow();

    window->open();

   就OK了。

头文件:console.h

#if !defined( _CONSOLEWINDOW_H )
#define _CONSOLEWINDOW_H

#include <windows.h>
#include <iostream>
#include <fstream>
#include <fcntl.h>
#include <io.h>

using namespace std;

class ConsoleWindow
{
    public:
        ConsoleWindow();
        ~ConsoleWindow();
       
        void Open();
        void Close();
        bool Status(){if (hStdHandle == INVALID_HANDLE_VALUE) return FALSE; else return TRUE;}

    protected:
        const WORD MAX_CONSOLE_ROWS;
        const WORD MAX_CONSOLE_COLUMNS;
        FILE *fp;
        HANDLE hStdHandle;
        int hConHandle;
};

#endif

cpp文件:console.cpp

#include "console.h"

ConsoleWindow::ConsoleWindow()
:   MAX_CONSOLE_ROWS(500),
    MAX_CONSOLE_COLUMNS(500)
{
    hStdHandle = INVALID_HANDLE_VALUE;
}

ConsoleWindow::~ConsoleWindow()
{
    if (hStdHandle != INVALID_HANDLE_VALUE)
    {
        FreeConsole();
        fclose(fp);
    }
}

void ConsoleWindow::Open()
{
    if (hStdHandle == INVALID_HANDLE_VALUE)
    {
        CONSOLE_SCREEN_BUFFER_INFO coninfo;

        // allocate a console for this app
        AllocConsole();

        // set the screen buffer to be big enough to let us scroll text
        GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
        coninfo.dwSize.Y = MAX_CONSOLE_ROWS;
        SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);

        // set title
        SetConsoleTitle(L"Debug Window");

        // redirect unbuffered STDOUT to the console
        hStdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
        hConHandle = _open_osfhandle((long)hStdHandle, _O_TEXT);
        fp = _fdopen( hConHandle, "w" );
        *stdout = *fp;
        setvbuf( stdout, NULL, _IONBF, 0 );

        // redirect unbuffered STDIN to the console
        hStdHandle = GetStdHandle(STD_INPUT_HANDLE);
        hConHandle = _open_osfhandle((long)hStdHandle, _O_TEXT);
        fp = _fdopen( hConHandle, "r" );
        *stdin = *fp;
        setvbuf( stdin, NULL, _IONBF, 0 );

        // redirect unbuffered STDERR to the console
        hStdHandle = GetStdHandle(STD_ERROR_HANDLE);
        hConHandle = _open_osfhandle((long)hStdHandle, _O_TEXT);
        fp = _fdopen( hConHandle, "w" );
        *stderr = *fp;
        setvbuf( stderr, NULL, _IONBF, 0 );
        // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog point to console as well
        ios::sync_with_stdio();
}
};

void ConsoleWindow::Close()
{
    if (hStdHandle != INVALID_HANDLE_VALUE)
    {
        FreeConsole();
        fclose(fp);
        hStdHandle = INVALID_HANDLE_VALUE;
    }
};

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值