由CHtmlView的OnDestroy引发的问题
时间:2010-10-09 来源:mmxida
最近在用MFC做小实验,用到了显示网页内容的CHtmlView类。在一个SDI的程序中,我继承了CHtmlView并创建了一个新类,然后把它添加到了一个TabCtrl里,测试发现,程序能使用Navigate2之类的方法实现显示特定的网页。但当我再调试模式下退出程序时,出现了访问违规。原来,虽然CHtmlView继承了CFormView,后者又继承自CView,但CHtmlView重写了OnDestroy方法,并在这个方法里什么也没做。
void CHtmlView::OnDestroy() { }
而在它的父类CFormView的OnDestory实现(实际上是继承了CView的实现)里却做了如下的工作:
void CView::OnDestroy() { CFrameWnd* pFrame = GetParentFrame(); if (pFrame != NULL && pFrame->GetActiveView() == this) pFrame->SetActiveView(NULL); // deactivate during death CWnd::OnDestroy(); }
这个差异,便导致了程序退出时的崩溃。我还没找到这个问题是由于MFC库的Bug,还是我编写的程序没有依照文档视图规范,但我解决这个问题的方法是:重写CHtmlView的OnDestroy方法,如下:
void CMyHtmlView::OnDestroy() { CHtmlView::OnDestroy(); // 防止程序退出时的GetActiveView断言 CFormView::OnDestroy(); }
另外,在使用CHtmlView的过程中,调试时会输出一些异常警告,
Warning: constructing COleException, scode = DISP_E_MEMBERNOTFOUND ($80020003). Warning: constructing COleException, scode = DISP_E_MEMBERNOTFOUND ($80020003).
这个问题可以通过重写CHtmlView的OnSize方法解决:
void CMyHtmlView::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy); // 注意:这里是CFormView而不是CHtmlView
// TODO: Add your message handler code here
if (::IsWindow(m_wndBrowser.m_hWnd))
{
CRect rect;
GetClientRect(rect);
::AdjustWindowRectEx(rect, GetStyle(), FALSE, WS_EX_CLIENTEDGE);
m_wndBrowser.SetWindowPos(NULL,
rect.left,
rect.top,
rect.Width(),
rect.Height(),
SWP_NOACTIVATE | SWP_NOZORDER);
}
}
相关阅读 更多 +