浅谈 MFC 的子类化机制和该机制的一个应用(2)
续: 浅谈MFC的子类化机制和该机制的一个应用(1):
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 下调试通过。
- · asp_dll
- · 学Java,观GP
- · 怎样写一个 NT 服务程序
- · 代码优化试验——短循环优化(上)
- · 代码优化试验——短循环优化(下)
- · =========<C++未眠夜---我学习C++的心路历程>========
- · BOOK
- · 读《Efficient C++》疑惑
- · C++中的预处理(下)
- · DSP v1.0--序列化和反序列化对象和DNS v1.0--得到域的邮件服务器
- · C++入门解惑(0)——序
- · 代码自动完成、文档自动生成、提高开发效率----介绍VcExtend
- · “瑜珈山夜话”---序
- · C++入门解惑(1)——浅析cout
- · VC6使用#pragma warning的一点经验
- · 如何在一个容器中放入不同对象(续)
- · “瑜珈山夜话” ----内存分配(一)
- · 最简单的屏幕拷贝程序(象素拷贝)
- · vc入门宝典(十)
- · Win32学习笔记 第六章 程序6-3 Typer 说明
- · 自动建库的安装程序制作方法
- · “瑜珈山夜话” ----内存分配(二)
- · 让Windows 2000/XP中的任意窗口透明起来
- · 不比不知道,一比吓一跳!
- · “瑜珈山夜话” ----内存分配(三)
- · WTL体系结构(3)
- · 控制台程序的事件處理
- · 深入DCOM之DCOM的发展史
- · Windows程序效率
- · C++入门解惑(2)——初探指针(上)
- · 读好文章,快速理解COM组件知识,10分钟深刻阅读,获得超过2000元的培训
- · WTL的消息机制
- · DirectShow应用——支持DVD播放
- · 浏览器集成教学 自定义浏览器
- · 计算机科学与技术学生学习基础材料参考
- · 关于std::list的sort函数在VC6下的修正
- · 数据结构学习(C++)——线性链式结构总结(代后记)【2】
- · 深入DCOM之STA
