此类可以实现在Windows窗口程序中创建一个控制台窗口来打印出调试信息。
这样可以方便查看变量的值或函数的状态。
#pragma once
//
//
class OutputFuncScope
{
public:
explicit OutputFuncScope(LPCTSTR lpszFunc);
~OutputFuncScope();
private:
LPCTSTR lpszFunc_;
};
//
class ConsoleOutput
{
public:
static ConsoleOutput* Instance();
explicit ConsoleOutput(LPCTSTR lpszWndTile = NULL);
BOOL Output(LPCTSTR lpszFmt, ...);
BOOL OutputLn(LPCTSTR lpszFmt, ...);
BOOL ShowWindow(BOOL bShow);
BOOL SetWindowTile(LPCTSTR lpszWndTitle);
~ConsoleOutput(void);
private:
class Garbo
{
public:
~Garbo() {
if (ConsoleOutput::instance)
delete ConsoleOutput::instance;
}
};
static Garbo garbo;
static ConsoleOutput* instance;
static Locker locker;
};
#include "StdAfx.h"
#include "ConsoleOutput.h"
ConsoleOutput* ConsoleOutput::instance = 0;
Locker ConsoleOutput::locker;
//
//
OutputFuncScope::OutputFuncScope(LPCTSTR lpszFunc) : lpszFunc_((LPTSTR)lpszFunc)
{
ConsoleOutput::Instance()->OutputLn(_T(">>%s"), lpszFunc_);
}
OutputFuncScope::~OutputFuncScope()
{
ConsoleOutput::Instance()->OutputLn(_T("<<%s"), lpszFunc_);
}
//
//
ConsoleOutput* ConsoleOutput::Instance()
{
if (!instance)
{
locker.Lock();
if (!instance)
instance = new ConsoleOutput;
locker.Unlock();
}
return instance;
}
ConsoleOutput::ConsoleOutput(LPCTSTR lpszWndTile)
{
if (::AllocConsole())
{
if (lpszWndTile)
::SetConsoleTitle(lpszWndTile);
}
}
BOOL ConsoleOutput::Output(LPCTSTR lpszFmt, ...)
{
const int kMaxLen = 1024;
TCHAR szText[kMaxLen] = { 0 };
va_list arglist;
va_start(arglist, lpszFmt);
_vstprintf_s(szText, _countof(szText), lpszFmt, arglist);
va_end(arglist);
return ::WriteConsole(::GetStdHandle(STD_OUTPUT_HANDLE), szText, _tcslen(szText), NULL, NULL);
}
BOOL ConsoleOutput::OutputLn(LPCTSTR lpszFmt, ...)
{
const int kMaxLen = 1024;
TCHAR szText[kMaxLen] = { 0 };
va_list arglist;
va_start(arglist, lpszFmt);
_vstprintf_s(szText, _countof(szText), lpszFmt, arglist);
va_end(arglist);
_tcscat_s(szText, kMaxLen, _T("\n"));
return ::WriteConsole(::GetStdHandle(STD_OUTPUT_HANDLE), szText, _tcslen(szText), NULL, NULL);
}
BOOL ConsoleOutput::ShowWindow(BOOL bShow)
{
return ::ShowWindow(::GetConsoleWindow(), bShow ? SW_SHOW : SW_HIDE);
}
BOOL ConsoleOutput::SetWindowTile(LPCTSTR lpszWndTitle)
{
if (lpszWndTitle)
return ::SetConsoleTitle(lpszWndTitle);
else
return FALSE;
}
ConsoleOutput::~ConsoleOutput(void)
{
::FreeConsole();
}
OutputFuncScope用来标记函数的开始和结束,ConsoleOutput为控制台输出,实用ConsoleOuptu::Install()->Output()或者OutputLn()即可向控制台输出调试信息。