自己实现一个release版的TRACE
2006-05-07 20:39
495 查看
很多人都用过MFC中的调试宏TRACE,一个非常方便的调试宏,但它只能在调试状态在编译器的输出窗口输出消息.有时候我们需要在一台没装编译器的电脑上试运行程序,这时如果能实现一个像TRACE消息输出功能将非常有用.
TRACE 的实现如下
void AFX_CDECL AfxTrace(LPCTSTR lpszFormat, ...)
{
#ifdef _DEBUG // all AfxTrace output is controlled by afxTraceEnabled
if (!afxTraceEnabled)
return;
#endif
//处理个数不定的参数
va_list args;
va_start(args, lpszFormat);
int nBuf;
TCHAR szBuffer[512];
nBuf = _vstprintf(szBuffer, lpszFormat, args);
ASSERT(nBuf < _countof(szBuffer));
if ((afxTraceFlags & traceMultiApp) && (AfxGetApp() != NULL))
afxDump << AfxGetApp()->m_pszExeName << ": ";
afxDump << szBuffer;
va_end(args);
}
#endif //_DEBUG
我在原来的基础上做了些修改
void __cdecl MyTrace(LPCTSTR lpszFormat, ...)
{
//处理个数不定的参数
va_list args;
va_start(args, lpszFormat);
int nBuf;
TCHAR szBuffer[512];
nBuf = _vstprintf(szBuffer, lpszFormat, args);
ASSERT(nBuf < _countof(szBuffer));
va_end(args);
static HWND hEdit=NULL;
if(hEdit==NULL)
{
HWND hwnd=GetDesktopWindow();
RECT rect;
GetWindowRect(hwnd,&rect);
//在桌面创建EDIT控件
hEdit=CreateWindowW(_T("EDIT"), //控件"类名称"
_T("MYTRACE"),
WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL| ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER,
rect.right-400,
rect.bottom-200,
400,
150,
hwnd,
NULL,
AfxGetApp()->m_hInstance, //实例句柄
NULL);
SetWindowPos(hEdit,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); //设置EDIT控件为最上面
}
//将szBuffer中的内容添加到EDIT控件中
if(hEdit)
{
SendMessage(hEdit,EM_SETSEL ,NULL,NULL);
SendMessage(hEdit,EM_REPLACESEL,NULL,(LPARAM)szBuffer);
}
}
在任意一个cpp文件中包含MyTrace函数定义
在stdafx.h文件中添加
#ifndef _DEBUG
#define TRACE MyTrace
#endif
void __cdecl MyTrace(LPCTSTR lpszFormat, ...);
现在你的TRACE宏在release版本中可以继续发挥作用了,快去试下效果吧!
TRACE 的实现如下
void AFX_CDECL AfxTrace(LPCTSTR lpszFormat, ...)
{
#ifdef _DEBUG // all AfxTrace output is controlled by afxTraceEnabled
if (!afxTraceEnabled)
return;
#endif
//处理个数不定的参数
va_list args;
va_start(args, lpszFormat);
int nBuf;
TCHAR szBuffer[512];
nBuf = _vstprintf(szBuffer, lpszFormat, args);
ASSERT(nBuf < _countof(szBuffer));
if ((afxTraceFlags & traceMultiApp) && (AfxGetApp() != NULL))
afxDump << AfxGetApp()->m_pszExeName << ": ";
afxDump << szBuffer;
va_end(args);
}
#endif //_DEBUG
我在原来的基础上做了些修改
void __cdecl MyTrace(LPCTSTR lpszFormat, ...)
{
//处理个数不定的参数
va_list args;
va_start(args, lpszFormat);
int nBuf;
TCHAR szBuffer[512];
nBuf = _vstprintf(szBuffer, lpszFormat, args);
ASSERT(nBuf < _countof(szBuffer));
va_end(args);
static HWND hEdit=NULL;
if(hEdit==NULL)
{
HWND hwnd=GetDesktopWindow();
RECT rect;
GetWindowRect(hwnd,&rect);
//在桌面创建EDIT控件
hEdit=CreateWindowW(_T("EDIT"), //控件"类名称"
_T("MYTRACE"),
WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL| ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER,
rect.right-400,
rect.bottom-200,
400,
150,
hwnd,
NULL,
AfxGetApp()->m_hInstance, //实例句柄
NULL);
SetWindowPos(hEdit,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); //设置EDIT控件为最上面
}
//将szBuffer中的内容添加到EDIT控件中
if(hEdit)
{
SendMessage(hEdit,EM_SETSEL ,NULL,NULL);
SendMessage(hEdit,EM_REPLACESEL,NULL,(LPARAM)szBuffer);
}
}
在任意一个cpp文件中包含MyTrace函数定义
在stdafx.h文件中添加
#ifndef _DEBUG
#define TRACE MyTrace
#endif
void __cdecl MyTrace(LPCTSTR lpszFormat, ...);
现在你的TRACE宏在release版本中可以继续发挥作用了,快去试下效果吧!
相关文章推荐
- Go实战--实现一个自己的网络请求日志httplogger(The way to go)
- 自己动手实现一个Android断点下载
- 自己动手实现一个守护进程,当控制台窗口关闭时还可以在后台运行。每隔一秒钟向my.log文件中插入一条记录
- 自己动手实现一个可垂直滑动的ViewGroup,相当于可以垂直滑动的viewpager
- 实现一个自己的网络浏览器
- 自己动手设计并实现一个linux嵌入式UI框架
- Struts2原理分析,自己实现一个struts2
- 实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定
- EventBus猜想 ----手把手带你自己实现一个EventBus
- Spring Boot 揭秘与实战 自己实现一个简单的自动配置模块
- cocos2d-x自己实现的一个button类
- 自己实现一个简单的Promise
- 用redigo自己实现一个redis连接池
- 想想自己的未来,给自己一个可以实现的理想,怀有一颗执着和激情的心生活和工作
- C 实现一个函数打印乘法口诀表 行数和列数自己指定
- 自己动手系列——实现一个简单的LinkedLis
- 创建一个类似发送短信时的软键盘,是需要自己实现还是改变软键盘类型?
- 关于S5PV210的启动问题和u-boot分析并自己实现一个简单的boot(一)
- 一个自己实现的rpc框架
- 自己尝试实现了一个lua_Reader