BOOL CDumpMsgBox::OnDumpOut(LPSTR pszDumpBuffer, UINT nBufferSize)
{
ASSERT(pszDumpBuffer != NULL && nBufferSize != 0);
ASSERT(AfxIsValidString(pszDumpBuffer, nBufferSize));
// calculate '\n' occur times in buffer.
int
nPosition, nLine = 0;
for
(nPosition = 0; nPosition < (int)nBufferSize; nPosition ++)
{
if
(pszDumpBuffer[nPosition] == '\0')
break;
if
(pszDumpBuffer[nPosition] == '\n')
nLine ++;
}
// alloc enough memory for convert.
TCHAR *pszBuffer = (TCHAR*)malloc(sizeof
(TCHAR) * (nPosition + nLine + 64));
// convert all '\n' '\r' or '\n\r' to '\r\n':
TCHAR *pszConvert = pszBuffer;
for
(nPosition = 0; nPosition < (int)nBufferSize; nPosition ++)
{
if
(pszDumpBuffer[nPosition] == '\0')
break
;
if
(pszDumpBuffer[nPosition] == '\r')
continue
;
if
(pszDumpBuffer[nPosition] == '\n')
{
*pszConvert = _T('\r');
pszConvert ++;
}
*pszConvert = (TCHAR)pszDumpBuffer[nPosition];
pszConvert ++;
}
// set end of string.
*pszConvert = '\0';
// set converted dump buffer to the edit control.
m_editDump.AssertValid();
m_editDump.SetWindowText(pszBuffer);
free(pszBuffer);
return
TRUE;
}
int
CDumpMsgBox::DoMessageBox(UINT nIDPrompt, UINT nType, UINT nIDHelp)
{
CString string;
if
(!string.LoadString(nIDPrompt))
{
TRACE1("CDumpMsgBox::DoMessageBox error: failed to load message box prompt string 0x%04x.\n",
nIDPrompt);
ASSERT(FALSE);
}
if
(nIDHelp == (UINT)-1)
nIDHelp = nIDPrompt;
return
DoMessageBox(string, nType, nIDHelp);
}
int
CDumpMsgBox::DoMessageBox(LPCTSTR lpszText, UINT nType, UINT nIDHelp)
{
int
nRetCode;
// not call PreCreateWindow to initialize CREATESTRUCT data.
AfxHookWindowCreate(this
);
nRetCode = AfxMessageBox(lpszText, nType, nIDHelp);
if
(!AfxUnhookWindowCreate())
PostNcDestroy();
return
nRetCode;
}
void
CDumpMsgBox::DoDumpObject(CObject* pDumpObject)
{
m_fileDump.AssertValid();
// dump target must exist.
ASSERT(pDumpObject != NULL);
CRuntimeClass* pClass = pDumpObject->GetRuntimeClass();
if
(pClass == NULL)
return
;
// unexpect runtime-class value.
if
(AfxIsValidAddress(pDumpObject, pClass->m_nObjectSize, TRUE))
{
#ifdef
_DEBUG
pDumpObject->Dump(m_dumpContext);
#else
// ! _DEBUG
m_dumpContext << "a " << pClass->m_lpszClassName <<
" at " << (void*)pDumpObject;
m_dumpContext << "\nHex Dumps: " << pClass->m_nObjectSize <<
" bytes long.\n";
m_dumpContext.HexDump(_T("HEX"), (BYTE*)pDumpObject,
pClass->m_nObjectSize, 8);
#endif
// _DEBUG
}
}
#ifdef
_DEBUG
void
CDumpMsgBox::AssertValid() const
{
CWnd::AssertValid();
if
(m_editDump.GetSafeHwnd())
m_editDump.AssertValid();
ASSERT(AfxIsValidAddress(&m_dumpContext, sizeof(CDumpContext), TRUE));
m_fileDump.AssertValid();
}
void
CDumpMsgBox::Dump(CDumpContext& dc) const
{
if
(m_hWnd == NULL)
{
CObject::Dump(dc);
dc << "m_hWnd = NULL\n";
}
else
CWnd::Dump(dc);
if
(0 < dc.GetDepth())
{
dc << "include ";
if
(NULL == m_editDump.GetSafeHwnd())
{
m_editDump.CObject::Dump(dc);
dc << "m_hWnd = NULL\n";
}
else
m_editDump.Dump(dc);
dc << "include ";
m_fileDump.Dump(dc);
}
}
#endif
// _DEBUG
代码较为简单,为
MessageBox
增加了一个
Edit Control
,属性为
ES_MULTILINE
,
ES_READONLY
,
ES_AUTOVSCROLL
,并且拥有
WS_EX_CLIENTEDGE
属性。
该
Edit Control
的内容通过
CMemFile
和
CDumpContext
生成。构造函数
CDumpContext( CFile* pFile )
可以生成一个以
CMemFile
为目标的
CDumpContext
实例,然后调用
CObject::Dump
,最后通过
CMemFile::Detach
得到包含输出字符串的缓冲区。
以下是
CDumpMsgBox
的应用示例:
CDumpMsgBox msgBox;
// declare intsance
msgBox.DoDumpObject(&msgBox);
// dump itself
msgBox.DoMessageBox(_T("This message box used class CDumpMsgBox."), MB_OKCANCEL);
// display
以上代码在
MS Visual C++ 6.0, Win98
下调试通过。
相关推荐
以前总搞不清mfc子类化是如何实现的,它与windows子类化的关系,看到这篇文章后霍然开朗,特推荐给大家共享。
走出MFC子类化的迷宫子类化,SUBCLASSWINDOW ,MFC消息机制
mfc子类化+双缓冲,解决图形刷新的闪烁问题
针对多文档的程序,截获客户区窗口的消息,在客户区窗口显示图片
分析子类化技术 超类化技术 MFC中对这两个技术的实现
VC++ MFC 按钮子类化自绘简单范例,通过子类化使鼠标指向按钮时改变按钮的样式。
MFC的消息机制的实现原理和消息处理的过程 对于MFC初学者可以很好了解其内部的运行机制 很好的资源
深入浅出MFC 深入浅出MFC 深入浅出MFC
Windows-MFC程序-07.MFC序列化机制和序列化类对象
微软公司提供的MFC基本类库(Microsoft Foundation Classes),是进行可视化编程时使用最为流行的一个类库。MFC封装了大部分Windows API函数和Windows控件,使得程序的开发变得简单,极大的缩短了程序的开发周期。MFC...
《深入浅出MFC》分为四大篇。第一篇提出学习MFC程序设计之前的必要基础,包括Windows程序的基本观念以及C++的高阶议题。
对MFC的讲解从基本原理到三大聚集的概念及使用,通过对一个个小程序的详解,让你了解利用MFC进行程式设计的来龙去脉。 本书的主要内容如下: 1。对win32程式的基本概念和开发流程的阐述。 2。对MFC六大关键技术的...
第五章和第六章,分析MFC编程框架启动和关闭一个应用程序的过程,揭示MFC框架的内幕,剖析以文档模板为核心创建基于文档-视的应用程序的过程,展示MFC框架处理消息和调用虚拟函数的时机和位置。 第七、八、九章,...
我收集的MFC资料,包括子类化,消息映射机制,MFC关键技术,常用数据转化,对象模型
深入浅出MFC(第二版) 目录 第0章 你一定要知道(导读) 这本书适合谁 你需要什么技术基础 你需要什么软硬件环境 让我们使用同一种语言 本书符号习惯 本书例程的取得 范例程序说明 与前版本之差异 如何联络作者 第...
创建第一个MFC应用程序 创建第一个MFC应用程序 创建第一个MFC应用程序
该代码利用MFC的序列化机制完成绘图数据的保存和加载
从实际应用入手,由浅入深、循序渐进地讲述Windows程序内部运行机制、MFC框架、文本、菜单、对话框、文件操作、网络编程、进程间通信、ActiveX控件、动态链接库、HOOK编程等多个主题。本书不同于一般的讲述VC++使用...
深入浅出MFC--侯捷深入浅出MFC--侯捷深入浅出MFC--侯捷深入浅出MFC--侯捷深入浅出MFC--侯捷深入浅出MFC--侯捷深入浅出MFC--侯捷