MFC程序利用控制台输出调试信息

frm: http://bbs.csdn.net/topics/350131824

近日研究师兄的一个MFC程序,见其会生成一个控制台窗口输出信息,就如同ANSYS的Output窗口,觉得这个功能实在有用。 

        于是研究了一下他的代码,不过因为其为DLL工程,又可怜我的VC6打不开他的VS2005的Test工程,原先的工程没有办法编通过。 
        于是想把实现此功能的类拆出来,仔细研究之后,做了个Test工程,居然不好用,不知道哪里出了问题。 
        于是google之,有几个结果可供参考: 
(1)Creating a console for your MFC app's debug output[http://www.codeproject.com/KB/debug/mfcconsole.aspx?df=100&forumid=822&exp=0&select=2656] 
(2)MFC 利用控制台输出调试信息[http://writeblog.csdn.net/PostEdit.aspx?entryId=1842880] 
(3) MFC/DLL 编程时用独立的控制台窗口显示用户自定义调试信息[这篇文章因为被转载多次,找不到出处,google标题即可找到] 
(4) GUI程序也能使用控制台窗口[http://bbs.51cto.com/thread-396954-1-1.html] 

        综合一下,其实现的方法基本一致。 
                1)调用AllocConsole()函数,创建一个Console; 
                2)调用_cprintf()函数,输出字符串; 
                        或者,重定向输出流(详见下文); 
                3)调用FreeConsole()函数,释放Console。




我将这个功能封装为两个文件,请将此文本内容下载到本地,保存为正确的文件名后使用。在不改变源代码的情况下实现,Debug版显示调试信息窗口,在Release版下不现实调试窗口且不增加程序负担。


###############DBWindow.h##################


/********************************************************************
创建日期: 2004/09/02
文件名称: DBWindow.h

      作者: 刘磊(vietor)
      版本: 2.0
      邮箱: liuleilover@163.com

创建目的:
      用VC MFC/DLL编程时通常Debug版需要将测试信息通过控制台输出,而
      编译成Release版时需要将这些输出调试信息的代码给注释掉,通
      常这些代码较多操作比较麻烦。
      这个程序的作用就是为了程序员在进行MFC/DLL软件开发时Debug版可以
      在一个单独的控制台窗口进行调试程序的输出,而做成Release版时
      不必手工将这些代码注释掉,由此程序自动完成。
      注意:在一个进程之内只存在一个控制台窗口,对于多个可能同时调试的DLL
      请用颜色识别。
版权声明:
      您可以随意拷贝和使用这个程序的副本,但请保证所有文件的完整和
      不被修改,如果您有修改意见,请与作者联系。

*********************************************************************/

#ifndef _DBWINDOW_
#define _DBWINDOW_

#include <windows.h>

//控制台输出时的文本颜色
#define WDS_T_RED    FOREGROUND_RED
#define WDS_T_GREEN   FOREGROUND_GREEN
#define WDS_T_BLUE   FOREGROUND_BLUE
//控制台输出时的文本背景颜色
#define WDS_BG_RED   BACKGROUND_RED
#define WDS_BG_GREEN BACKGROUND_GREEN
#define WDS_BG_BLUE   BACKGROUND_BLUE

#ifdef _DEBUG

//设置控制台输出窗口标题
BOOL DBWindowTile(LPCTSTR tile);
//格式化文本输出
BOOL DBWindowWrite(LPCTSTR fmt,...);
//带颜色格式化文本输出
BOOL DBWindowWrite(WORD Attrs,LPCTSTR fmt,...);

#else

#define DBWindowTile
#define DBWindowWrite

#endif

#endif



###############DBWindow.cpp################

/********************************************************************
创建日期: 2004/09/02
文件名称: DBWindow.cpp

      作者: 刘磊(vietor)
      版本: 2.0
      邮箱: liuleilover@163.com

创建目的:
      用VC MFC/DLL编程时通常Debug版需要将测试信息通过控制台输出,而
      编译成Release版时需要将这些输出调试信息的代码给注释掉,通
      常这些代码较多操作比较麻烦。
      这个程序的作用就是为了程序员在进行MFC/DLL软件开发时Debug版可以
      在一个单独的控制台窗口进行调试程序的输出,而做成Release版时
      不必手工将这些代码注释掉,由此程序自动完成。
      注意:在一个进程之内只存在一个控制台窗口,对于多个可能同时调试的DLL
      请用颜色识别。
版权声明:
      您可以随意拷贝和使用这个程序的副本,但请保证所有文件的完整和
      不被修改,如果您有修改意见,请与作者联系。

*********************************************************************/


#include "stdafx.h"
#include "DBWindow.h"

#ifdef _DEBUG

#include <tchar.h>
#include <stdio.h>
#include <stdarg.h>

#define CONSOLE_TILE _T("DBWindow Ver 2.0 by LiuLei")

class ConsoleWindow 
{
public:
ConsoleWindow();
virtual ~ConsoleWindow();

BOOL SetTile(LPCTSTR lpTile);
BOOL WriteString(LPCTSTR lpString);
BOOL WriteString(WORD Attrs,LPCTSTR lpString);
private:
HANDLE m_hConsole;
BOOL   m_bCreate;
BOOL   m_bAttrs;
WORD   m_OldColorAttrs; 
};

ConsoleWindow::ConsoleWindow()
{
m_hConsole=NULL;
m_bCreate=FALSE;
if(AllocConsole())
{
   m_hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
   SetConsoleTitle(CONSOLE_TILE);
   SetConsoleMode(m_hConsole,ENABLE_PROCESSED_OUTPUT);
   m_bCreate=TRUE;
}
else{
   m_hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
   if(m_hConsole==INVALID_HANDLE_VALUE)
    m_hConsole=NULL;
}
if(m_hConsole)
{
   CONSOLE_SCREEN_BUFFER_INFO csbiInfo; 
   if(GetConsoleScreenBufferInfo(m_hConsole, &csbiInfo))
   {
    m_bAttrs=TRUE;
    m_OldColorAttrs = csbiInfo.wAttributes;      
   }
   else{
    m_bAttrs=FALSE;
    m_OldColorAttrs = 0;
   }
}
}

ConsoleWindow::~ConsoleWindow()
{
if(m_bCreate)
   FreeConsole();
}

BOOL ConsoleWindow::SetTile(LPCTSTR lpTile)
{
return SetConsoleTitle(lpTile);
}

BOOL ConsoleWindow::WriteString(LPCTSTR lpString)
{
BOOL ret=FALSE;
if(m_hConsole)
{
   ret=WriteConsole(m_hConsole,lpString,_tcslen(lpString),NULL,NULL);
}
return ret;
}

BOOL ConsoleWindow::WriteString(WORD Attrs,LPCTSTR lpString)
{
BOOL ret=FALSE;
if(m_hConsole)
{
    if(m_bAttrs)SetConsoleTextAttribute(m_hConsole,Attrs);
    ret=WriteConsole(m_hConsole,lpString,_tcslen(lpString),NULL,NULL);
    if(m_bAttrs)SetConsoleTextAttribute(m_hConsole,m_OldColorAttrs);
}
return ret; 
}

ConsoleWindow ConWindow;

#define MAX_BUF_LEN 4096

BOOL DBWindowTile(LPCTSTR tile)
{
return ConWindow.SetTile(tile);
}

BOOL DBWindowWrite(LPCTSTR fmt,...)
{
TCHAR   message[MAX_BUF_LEN];
va_list cur_arg;
va_start(cur_arg,fmt);
_vsntprintf(message,MAX_BUF_LEN,fmt,cur_arg);
va_end(cur_arg);
return ConWindow.WriteString(message);
}

BOOL DBWindowWrite(WORD Attrs,LPCTSTR fmt,...)
{
TCHAR   message[MAX_BUF_LEN];
va_list cur_arg;
va_start(cur_arg,fmt);
_vsntprintf(message,MAX_BUF_LEN,fmt,cur_arg);
va_end(cur_arg);
return ConWindow.WriteString(Attrs,message); 
}

#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值