#define MB_USERDEFINE 0x10000000
AfxMessageBox 的第二个参数 nType 是指定 MessageBox 的类型,在 Winuser.h 中定义了一些标准的类型,
请注意 nType 是 UINT 类型的,而标准类型的定义才不到10个,你完全可以添加自己的 MessageBox 类型!
在 CMyApp.h 中定义:
#define MB_USERDEFINE 0x10000000
在CMyApp中定义成员变量
FILE *m_LogFile;
在CMyApp中重载虚函数 DoMessageBox
int CMyApp::DoMessageBox(LPCTSTR lpszPrompt, UINT nType, UINT nIDPrompt)
{
// TODO: Add your specialized code here and/or call the base class
if (MB_USERDEFINE == nType)
{
if(_tcslen(lpszPrompt) == 0)
//_tcslen(lpszPrompt)函数,求Unicode字符串(此处为lpszPrompt)的长度,
//使用跟非Unicode的strlen一样
return TRUE;
CString csMsgString = lpszPrompt; //赋值;
if(csMsgString[csMsgString.GetLength()-1] != _T('\n'))//最后一个不是换行;
csMsgString += _T("\r\n"); //添加换行回车 _T是得到UNICODE字符串;
else
{
csMsgString.Insert(csMsgString.GetLength()-1,_T('\r'));
//c.insert(B,L,R)即在B位置,插入[L,R)之间的数。('\n'前面加上'\r');
}
if(m_LogFile == NULL)//打开文件
{
_wfopen_s(&m_LogFile,GetCurrentPath()+_T("log.txt"),_T("a+"));
}
if(m_LogFile != NULL)
{
CTime t = CTime::GetCurrentTime();
//MultiByteToWideChar(CP_ACP,0,MsgBuff,strlen(MsgBuff),csMsgString.GetBuffer(MAX_PATH),MAX_PATH);
//CWideToAnsi::convert(MsgBuff,csMsgString);
MsgBuff=THCAR2char(csMsgString.GetBuffer(MAX_PATH));
fprintf(m_LogFile,"%4d-%02d-%02d %02d:%02d:%02d %s",
t.GetYear(), t.GetMonth(), t.GetDay(),
t.GetHour(), t.GetMinute(), t.GetSecond(), MsgBuff);
fflush(m_LogFile);
//输出时间信息,输出到文件log.txt中
}
//CWideToAnsi::convert(MsgBuff,lpszPrompt);//转换
return TRUE;
}
else
return CWinApp::DoMessageBox(lpszPrompt, nType, nIDPrompt);
}
在构造函数中初始化 m_LogFile = NULL;
在InitInstance中关闭m_LogFile
BOOL CMyApp::InitInstance()
{
CWinApp::InitInstance();
if(m_LogFile) //CRecordServer::FILE *m_LogFile定义的量
fclose(m_LogFile);//fclose关闭一个流,
//把缓冲区内最后剩余的数据输出到磁盘文件中,
//并释放文件指针和有关的缓冲区
return TRUE;
}
CString GetCurrentPath()
{
TCHAR TExeFullPath[MAX_PATH];
CString csCurrentPath;
GetModuleFileName(NULL,TExeFullPath,MAX_PATH);//获取一个已装载模板的完整路径名称
csCurrentPath = TExeFullPath;
int pos = csCurrentPath.ReverseFind(_T('\\'));//pos等于从右往左找到的“\\”的位置
return csCurrentPath.Mid(0,pos+1);//从字符串中返回指定数目的字符
}
使用AfxMessageBox(_T("程序运行"),MB_USERDEFINE);
这样就可以在程序中打印日志了